Я пытаюсь решить эту, казалось бы, простую общую проблему приведения:
Во-первых, объявление этого простого универсального объекта:
public interface GenericObject<T> {}
Во-вторых, объявление этого рабочего интерфейса:
public interface Generic { // I don't want to do Generic<T>
<T> void setGenericObject(GenericObject<T> obj);
}
Затем давайте реализуем этот интерфейс:
public class GenericImpl implements Generic {
private GenericObject<String> genericObject; // This is needed
@Override
public <String> void setGenericObject(GenericObject<String> obj) {
genericObject = obj; // eclipse give me this error :
// Type mismatch: cannot convert from
// interfaces.GenericObject<String> to
// interfaces.GenericObject<java.lang.String>
}
}
Как я могу решить эту ошибку?
Редактировать :
На самом деле, единственный способ решить эту проблему - сделать это:
public class GenericImpl implements Generic {
private GenericObject<String> genericObject;
@SuppressWarnings("unchecked") // I don't realy like this
@Override
public <T> void setGenericObject(GenericObject<T> obj) {
genericObject = (GenericObject<String>) obj;
}
}
<String> void
делает не то, что вы думаете. Вы определяете новый параметр универсального типа, используя идентификатор String. С таким же успехом можно сказать<FooBar> void
. Вы должны удалить его. Единственная проблема заключается в том, что когда вы это делаете, метод неправильно переопределяет метод из интерфейса. - person Michael   schedule 23.11.2018Generic
указывает, что любые разработчики должны иметь возможность реализоватьsetGenericObject
для всех значенийT
. Ваша реализация работает только для строк, поэтому она не выполняет контракт, определенный интерфейсом. Лучший способ достичь того, чего вы хотите, — это иметьGeneric<T>
иGenericImpl implements Generic<String>
, но вы сказали, что не хотите этого делать. - person Michael   schedule 23.11.2018@SuppressWarning
? - person MonkeyJLuffy   schedule 23.11.2018