Реализация абстрактного универсального метода в Java с несколькими дженерикамиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Реализация абстрактного универсального метода в Java с несколькими дженериками

Сообщение Anonymous »

Речь идет о дженерических методах в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»