私は通常、Java を初めて使用する C# 開発者であり、Generics を使用していくつかのコードをセットアップしようとしています。私のデモコードは次のようになります。
// 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# 開発者なので、コードは一見すると良さそうに見えます。getMeStuff を変更して (T) にキャストを追加することで、このエラーを「解決」できますが、そのキャストは本当に必要ですか? 何かを忘れたような匂いがしますか?