Я обычно разработчик C#, новый для Java, и я пытаюсь настроить код с помощью Generics. Мой Демонстрационный код выглядит следующим образом:Невозможно преобразовать X в T, хотя X должен соответствовать T?
// Main.java
public static void main(String[] args) {
MyBase my = getMeStuff();
System.out.println(my.getSomething());
}
private static <T extends MyBase> T getMeStuff(){
return new MyDerived(123);
}
// MyBase/MyDerived.java
public class MyBase {
private final int something;
protected MyBase(int something) { this.something = something; }
public int getSomething() { return something; }
}
public class MyDerived extends MyBase {
public MyDerived(int something) { super(something); }
}
Это не может скомпилировать:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from x.MyDerived to T
at x.Main.getMeStuff(Main.java:14)
at x.Main.main(Main.java:9)
Как уже говорилось, я обычно C# Developer, поэтому код выглядит хорошо на первый взгляд. Я могу «разрешить» эту ошибку, изменив getMeStuff, чтобы добавить приведение к (T), но действительно ли это необходимо? Это немного пахнет, как будто я что-то забыл?
Зачем использовать общий тип, если вы возвращаете фиксированный известный тип? –
@Oli, потому что фактическая реализация более сложна и может возвращать один из многих типов (он фактически принимает класс, который создается через отражение) –