私はジェネリック医薬品で少し痛いです。Javaコンパイラがジェネリック型を返さないのはなぜですか?
public interface SampleValue<T> {
T getValue();
}
public static class SampleBoolean implements SampleValue<Boolean> {
@Override
public Boolean getValue() {
return Boolean.TRUE;
}
}
public static final class SampleValueGenerator {
private SampleValueGenerator() {
// do not call
}
public static <T, R extends SampleValue<T>> R forType(Class<T> clazz) {
if(Boolean.class.equals(clazz)) {
return new SampleBoolean();
}
}
}
私はこれをしようとすると、IntelliJの(すなわち、コンパイラは)R
とSampleBoolean
は(return
ライン用)互換性のない型であることを私に語った:私は、次のコードを持っています。
私は非ジェネリック(生)戻り値の型をしようとすると
public static <T> SampleValue forType(Class<T> clazz) {
私はすべてのエラーを得ることはありません。 (?
ワイルドカード付き)
public static <T, R extends SampleValue<?>> R forType(Class<T> clazz) {
しかし再度失敗。そして
public static <T> SampleValue<T> forType(Class<T> clazz) {
のために私はIncompatible types, Found: SampleBoolean, Required: SampleValue<T>
を取得します。
私の推測では、リスト(兄弟)の祖先ではないリストが、私は上記の木の木が見えない。
誰かが何が起こっているのか、長い例がうまくいかない理由を説明してもらえますか?
更新:NB:あなたが戻ってきているRは、常にその実装Rである
'AnotherSampleBooleanクラスを宣言してSampleValue {...}'を実装し、次に 'AnotherSampleBoolean result = forType(Boolean.class)'を呼び出すことで、サンプルコードを解くことができます。 'R'は' AnotherSampleBoolean'として推論され、実行時に 'SampleBoolean'を' AnotherSampleBoolean'にキャストする 'ClassCastException'を投げます。だから、もしあなたがこのようなことをやっているとすれば、コンパイルエラーを回避するためにチェックされていないキャストを使用すると、 ' SampleValue forType(クラス)'が最も安定しています。 –
Radiodef
感のようなものを作る@Radiodefが、 ' SampleValue forType(クラス)'あまりにも、失敗した... –
Christian
'パブリック静的 SampleValue > forType(クラス clazz){'(ワイルドカードで、非ジェネリック戻り値の型)works ... –
Christian