クラスパラメータを使用して型情報を渡すときに、Javaが型を推測し、型の境界をチェックする際に異なる動作をする理由を理解しようとしています。
このコードを例にとると:
public class TypeTest<T extends Number> {
Class<T> type;
TypeTest(Class<T> type) { this.type = type; }
static <S extends Number> void sMethod(Class<S> type) {}
<S extends Number> void method(Class<S> type) {}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
// 1.
TypeTest<Integer> obj = new TypeTest(Object.class); // compiles, unchecked call and assignment warnings
// 2.
obj.method(Object.class); // compile-time error, S not within bound
TypeTest obj1 = new TypeTest(Object.class); // compiles, unchecked call and assignment warnings
// 3.
obj1.method(Object.class); // compiles, unchecked call warning .
// 4.
TypeTest.sMethod(Object.class); // compile time error, Object not within bounds
// 5.
new TypeTest<Object>(Object.class); // compile time error, Object not within bounds
}
}
静的メソッド(4.)では、提供された境界で最も自然な動作と思われる数値以外のものを渡すことはできません。
ただし、コンストラクター(1.、5。)では、4と同じ動作を取得するために、型パラメーターを明示的に指定する必要があります。そうしないと、T型パラメーター値がObject.class変数から自動的に推測されないようです。
この違いは、コンストラクターメソッドと静的メソッドのどこから来るのでしょうか。
私が完全に理解していないもう1つのケースは、2と3の違いです。なぜ同じ操作がTypeTestオブジェクトの構築方法にのみ依存してコンパイルされるか、コンパイルされないのに、クラス型パラメーターTはメソッドとはまったく関係がありません。タイプパラメータS?