0

クラスパラメータを使用して型情報を渡すときに、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?

4

3 に答える 3

1

メソッドまたはコンストラクターに対して宣言されたジェネリック型のみを推測できます。それで

<S> void method() {}
 ^ this can be inferred

<S> TypeTest() {}
 ^ this can be inferred

ジェネリッククラスのジェネリック型は、それを構築するときに推測できません。

class TypeTest<T> {}
               ^ this must be specified explicitly when using "new TypeTest"
                 or in Java 7 you can explicitly specify the diamond operator

他の人が言っているように、new TypeTest()山かっこなしで使用する場合は、rawタイプを使用しています。生の型は、古いコードとの互換性を維持するために、ジェネリック以前と同じように機能する必要があります。したがって、式new TypeTest()にはTypeTest、ではなくタイプ(rawタイプ)が含まれTypeTest<something>ます。

于 2012-10-18T18:36:02.930 に答える
1

new TypeTest(Object.class)は生の型の表現であり、TypeTestそれが設計された方法です。したがって、もちろん、推論する型がないため、型推論は行われません

于 2012-10-18T17:25:50.730 に答える
1

ジェネリック型の型パラメーターを省略すると、つまり、TypeTestなしで入力すると、 Javaはその型すべてのすべてのジェネリックチェックを<Something>無視します。

詳細については、 http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.htmlを参照してください。

于 2012-10-18T17:25:53.147 に答える