次のシナリオを考えると
class Base { }
class Extended extends Base {}
ジェネリック型のサブクラスであるジェネリック クラスのコンストラクターで、クラス オブジェクトを簡単に要求できます。
class Test<T extends Base> {
Test(Class<? extends T> test) { }
}
このようにして、次のすべてを行うことができます
new Test<Base>(Base.class);
new Test<Base>(Extended.class);
new Test<Extended>(Base.class); // This is not allowed by the compiler
new Test<Extended>(Extended.class);
まさに私が欲しいものです。ただし、次のような一般的なメソッドを使用すると、同じ制約をどのように達成できるかわかりません。
<T extends Base> void test(T x, Class<? extends T> test) { }
この定義により、次のすべてがコンパイラによって許可されます。
test(new Base(), Base.class);
test(new Base(), Extended.class);
test(new Extended(), Base.class); // even though Base is not a subclass of Extended
test(new Extended, Extended.class);
これは、型推論とJavaの決定によるものだと思います
<Base>test(new Extended(), Base.class)
それ以外の
<Extended>test(new Extended(), Base.class)
しかし、後者の推論方法を強制するにはどうすればよいでしょうか?
手伝ってくれてありがとう!
将来の読者のために: この質問の最初のバージョンでは、Base
A
とExtended
B
. 後でこの表記法を明確にしました。ただし、この表記は回答で使用されます。