Речь идет о дженерических методах в Java с двумя дженериками (один для возвращаемого типа, другой для формального параметра) и о том, как их реализовать.
Думаю, мне что-то не хватает на картинке, чтобы это работало.
Дело вот в чем...
Это работает :
public enum Getter
{
BillItemsSize {
@Override
public Integer get (Object entity) {
DesiredClass ref = (DesiredClass ) entity; // "Old time" cast
// do things...
}
};
public abstract T get (K entity);
}
Это не работает:
public enum Getter
{
BillItemsSize {
@Override
public Integer get (DesiredClass entity) { // no cast at all
// do things
}
};
public abstract T get (K entity);
}
Компилятор Java кричит мне следующее:
is not abstract and does not override abstract method get(K) in Getter
Ну, такова ситуация.
П.Д: Это не проблема типов перечислений... это происходит в иерархиях классов. Так что не стоит винить перечисления, я пробовал, не помогло.
public abstract class SuperClass
{
public abstract T pepe (E e);
}
public class SubClass extends SuperClass
{
@Override
public Integer pepe(DesiredClass e) // fails...
{
return null;
}
}
ОБНОВЛЕНО:
Для параметров Generics
Мы можем сделать общее правило, согласно которому для «параметра Generics» (тех, чьи типы являются универсальными) тип, неявно взятый в сигнатуре метода, равен верхним пределам этого универсального параметра, который может быть Object, если ничего не указано, или более конкретным подклассом, если используются верхние границы (в примере T расширяет String).
Для типов возврата Generics
Нет проблем с перезаписью универсального метода определенным типом возвращаемого значения, если тип возвращаемого значения является подтипом перезаписанного типа возвращаемого значения. И каков тип возвращаемого значения в первую очередь? Ну, это оказался Объект. По умолчанию компилятор предполагает (в сигнатуре метода) универсальный тип как тип объекта.
Поэтому мы должны понимать, что хитрость заключается в том, чтобы знать, что любой метод, который имеет общий тип возврата, на самом деле имеет тип возврата Object.
Тогда, если в каких-либо подклассах метод будет перезаписан и мы изменим тип возвращаемого значения, указав, что он возвращает другой тип, проблем не будет. Потому что, помимо того, что этот метод будет возвращать объект другого класса, этот возвращаемый объект неизбежно будет подклассом класса Object, и не будет проблем с перезаписью метода другим типом возвращаемого значения, отличным от исходного, если он является подтипом оригинала. Техника, называемая ковариантным типом возвращаемого значения, позволяет нам сделать это.
public abstract class SuperClass
{
public abstract T operation ();
}
public class SubClass extends SuperClass
{
@Override
public Chair operation()
{
//bla bla
}
}
тем временем в другой части кода...
void main ()
{
SubClass sb = new SubClass();
Chair chair = sb.operation ();
// the chair type can be easely replaced by super type (like Object)
Object object = sb.operation();
}
Подробнее здесь: https://stackoverflow.com/questions/140 ... rics-types
Реализация абстрактного универсального метода в Java с несколькими дженериками ⇐ JAVA
Программисты JAVA общаются здесь
1764426689
Anonymous
Речь идет о дженерических методах в Java с двумя дженериками (один для возвращаемого типа, другой для формального параметра) и о том, как их реализовать.
Думаю, мне что-то не хватает на картинке, чтобы это работало.
Дело вот в чем...
Это [b]работает[/b] :
public enum Getter
{
BillItemsSize {
@Override
public Integer get (Object entity) {
DesiredClass ref = (DesiredClass ) entity; // "Old time" cast
// do things...
}
};
public abstract T get (K entity);
}
Это [b]не работает[/b]:
public enum Getter
{
BillItemsSize {
@Override
public Integer get (DesiredClass entity) { // no cast at all
// do things
}
};
public abstract T get (K entity);
}
Компилятор Java кричит мне следующее:
is not abstract and does not override abstract method get(K) in Getter
Ну, такова ситуация.
П.Д: Это не проблема типов перечислений... это происходит в иерархиях классов. Так что не стоит винить перечисления, я пробовал, не помогло.
public abstract class SuperClass
{
public abstract T pepe (E e);
}
public class SubClass extends SuperClass
{
@Override
public Integer pepe(DesiredClass e) // fails...
{
return null;
}
}
ОБНОВЛЕНО:
[b]Для параметров Generics[/b]
Мы можем сделать общее правило, согласно которому для «параметра Generics» (тех, чьи типы являются универсальными) тип, неявно взятый в сигнатуре метода, равен верхним пределам этого универсального параметра, который может быть Object, если ничего не указано, или более конкретным подклассом, если используются верхние границы (в примере T расширяет String).
[b]Для типов возврата Generics[/b]
Нет проблем с перезаписью универсального метода определенным типом возвращаемого значения, если тип возвращаемого значения является подтипом перезаписанного типа возвращаемого значения. И каков тип возвращаемого значения в первую очередь? Ну, это оказался Объект. По умолчанию компилятор предполагает (в сигнатуре метода) универсальный тип как тип объекта.
Поэтому мы должны понимать, что хитрость заключается в том, чтобы знать, что любой метод, который имеет общий тип возврата, на самом деле имеет тип возврата [b]Object[/b].
Тогда, если в каких-либо подклассах метод будет перезаписан и мы изменим тип возвращаемого значения, указав, что он возвращает другой тип, проблем не будет. Потому что, помимо того, что этот метод будет возвращать объект другого класса, этот возвращаемый объект неизбежно будет подклассом класса Object, и не будет проблем с перезаписью метода другим типом возвращаемого значения, отличным от исходного, если он является подтипом оригинала. Техника, называемая ковариантным типом возвращаемого значения, позволяет нам сделать это.
public abstract class SuperClass
{
public abstract T operation ();
}
public class SubClass extends SuperClass
{
@Override
public Chair operation()
{
//bla bla
}
}
тем временем в другой части кода...
void main ()
{
SubClass sb = new SubClass();
Chair chair = sb.operation ();
// the chair type can be easely replaced by super type (like Object)
Object object = sb.operation();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/14007210/implementing-abstract-generic-method-in-java-with-multiple-generics-types[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия