1

公式の Java JDK1.7 ガイドからこの引用を入手しましたが、その仕組みがわかりません。誰でも説明できますか?言い換えれば、空の文字列が渡された場合、ダイヤモンドはどのように整数型を推測するのでしょうか?

MyClass<Integer> myObject = new MyClass<>("");

この例では、コンパイラは、ジェネリック クラス MyClass の仮型パラメーター X の型 Integer を推論します。このジェネリック クラスのコンストラクターの仮型パラメーター T の String 型を推論します。

4

2 に答える 2

8

Integerパーツは、コンストラクター呼び出しの結果の使用法から推測さます - type の変数に割り当てられているため、ダイヤモンドMyClass<Integer>のパーツが推測されます。Integerコンストラクターの引数は、これとは無関係です (同じ型である必要がある場合を除きます。その場合、コンパイル エラーが発生するだけです)。

基本的に、式が使用されているコンテキストから型引数が明らかな場合 (「明確な」とは、もちろん「正確な規則に従う」ことを意味します)、コンパイラはそれを推論します。

于 2013-10-25T15:48:58.633 に答える
1

引用符は、独自の型パラメーターを宣言する汎用コンストラクターがクラスにあることを示しています。これは、ジェネリック メソッドを作成する方法と似ています。コンストラクターの型パラメーターは、クラスのインスタンス化中に渡す引数から推測されます。

その呼び出しに一致するクラスの単純なバージョンを次に示します。

 class MyClass<T> {
    <S> MyClass(S arg) {
        System.out.println(arg);
    }
 }

コードのようにクラスをインスタンス化すると、渡された引数から、型パラメーターTは として推論され、コンストラクターのInteger型パラメーターは として推論されます。SString

ひし形演算子に関しては、Java 7 以降では、既に参照に参照を割り当てている場合、ジェネリック クラスのインスタンスを作成するときに型引数を指定する必要はありません。型引数は、参照型 here で使用されるものから推測されますInteger

于 2013-10-25T15:54:24.263 に答える