私はこの二つのインタフェースとクラスを持っています。しかし、私の意見ではGenericRepository(K)の2番目のジェネリックパラメータは冗長です。私はMyEntityが識別可能であることを知っているので、私は私が最終的にこのようにそれを使用することができた場合、それは素晴らしいことだと思う:冗長ジェネリックパラメータは
public class MyService {
private GenericRepository<MyEntity> myEntityRepository;
}
しかし、私は成功しなくて違うことをしようとしています。出来ますか?そうでない場合は、どうしてですか?
更新:いくつかの回答に答える。私は、コンパイラがMyEntityのジェネリック型であるかどうかを知っていると思います。例:
public class MyEntityGenericRepository implements GenericRepository<MyEntity, Long> {
// compiles...
}
public class MyEntityGenericRepository implements GenericRepository<MyEntity, String> {
// compiler says: "Bound mismatch: The type MyEntity is not a valid substitute for the bounded parameter <T extends Identifiable<K>> of the type GenericRepository<T,K>"
}
感謝を持つことができ、他の操作を行うことができないが、私は同意しません。私の編集を見てください。 – sinuhepop
@sinuhepopもちろん、コンパイラは、 'Kの実際の型が' Identifiable 'の型パラメータの型と一致するかどうかをチェックできます。それでも、* Kをジェネリック型パラメータにする必要があります(結果的にインスタンス化の時点でその実際の値を渡す必要があります)。これは、言語がどのように機能するかです。あなたはこの知識が理論上コンパイラによって推論されることは間違いありませんが、それは今のところではなく、何年も前からです...残念ながら(残念ながら、Javaの開発はその方向に非常にゆっくりと動いています。 ..)。 –