Как переопределить метод, имеющий параметр Object, с помощью универсального параметра?

Я хочу переопределить метод с параметром типа Object:

public void setValue(Object value) {
    // ...
}

и сделайте этот параметр универсальным типом T:

@Override
public void setValue(T value) {
    super.setValue(value);
}

Как я могу это сделать на Java?

В Eclipse я получаю следующие ошибки:

Multiple markers at this line
- The type parameter T is hiding the type T
- Name clash: The method setValue(T) of type TextField<T> has the 
 same erasure as setValue(Object) of type JFormattedTextField but does not 
 override it
- The method setValue(T) of type TextField<T> must override or 
 implement a supertype method

person Jonas    schedule 29.11.2011    source источник
comment
Это может быть то, что вы ищете stackoverflow.com/questions/239645/   -  person loosebazooka    schedule 30.11.2011
comment
Вы не можете заставить метод переопределения принимать более узкий тип, чем метод, который он переопределяет, точка.   -  person millimoose    schedule 30.11.2011


Ответы (2)


Вы не можете заставить метод переопределения принимать более узкий тип, чем метод, который он переопределяет.

Если бы вы могли, было бы возможно следующее:

class A {
    public setValue(Object o) {…}
}

class B<T> extends A {
    @Override
    public setValue(T o) {…};
}

A a = new B<String>(); // this is valid
a.setValue(new Integer(123)); // this line would compile, but make no sense at runtime 
person millimoose    schedule 30.11.2011
comment
Но почему бы a.setValue(new Integer(123)); не работать, если Integer наследуется от Object? - person Jonas; 30.11.2011
comment
@Jonas: Потому что переменная a содержит объект типа B<String>, и будет вызван метод замены в B. Тип переменной не имеет значения для привязки метода, важен тип сохраняемого объекта. - person millimoose; 30.11.2011

Использовать:

<T extends Object> public void setValue(T o) {…};

Тогда с a.setValue(new Integer(123)); проблем не будет. Просто определите как A a = new B();. Вы можете сделать это более узким, заменив Object желаемым классом.

person Suminda Sirinath S. Dharmasena    schedule 30.11.2011
comment
Это не работает: Multiple markers at this line - Syntax error on token "public", delete this token - The method setValue(T) of type TextField<T> must override or implement a supertype method - Name clash: The method setValue(T) of type TextField<T> has the same erasure as setValue(Object) of type JFormattedTextField but does not override it - person Jonas; 30.11.2011
comment
Попробуйте TextField<T extends Object> - person Suminda Sirinath S. Dharmasena; 30.11.2011
comment
Нет, не работает. И подпись вашего метода неверна. Он должен вернуть void. - person Jonas; 30.11.2011
comment
Лично мне помогло использование ‹T extends Object› вместо простого ‹Object›. +1 - person Gangnus; 29.02.2012