Думаю, мне что-то не хватает на картинке, чтобы это работало.
Дело вот в чем...
Это работает :
Код: Выделить всё
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);
}
Код: Выделить всё
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
Мобильная версия