2012-04-10 9 views
2

は、次のコードを考えてみましょう2ウェイ:Javaのパラメータ化メソッドの戻り値の型は

(new MyClass()).<ExtType>foo(ExtType.class); 

興味深いことに、メソッドがパラメータ化されて宣言されていても、Eclipseは に対して1回の呼び出しで警告を発行しません。ここで

T秒の戻り値をキャストに使用されている最初のコードスニペットで、私の質問です。 パラメータはT、戻り値はTですか?戻り値の型を明示的に指定しないと(「1ウェイ」のように)警告が出されないのはなぜですか?

答えて

4

は、通常、パラメータの型が使用されているが、(方法2のように)定義された戻り値の型がある場合、コンパイラは同様のことをチェックします。その後、型推論と呼ばれる、からTの種類を取得するには何のパラメータがない場合

戻り値の型宣言は必要であろう。したがって、あなたも書くことができます:あなたは、コンパイラを助け、(new MyClass()).<ExtType>foo(ExtType.class);のようなコードを取得するために使用するタイプを指定する必要がありますいくつかのケースでは

public <T extends MyType> T foo() { 
    return (T)myField; 
} 


ExtType t = (new MyClass()).foo(); 

を。ただし、異なるタイプを定義するとします(例: (new MyClass()).<MyType>foo(ExtType.class);の場合、コンパイラはどのコンパイラが使用されているか分からないので、コンパイル時エラーが発生します。

+0

お返事ありがとうございます。 '(新しいMyClass())foo();'が呼び出され、 'foo()'の中にキャストが実行されないか、より正確に 'Object'へのキャストが行われるでしょうか? – dhblah

+0

@gasanでもキャストは起こりますが、戻り値を代入する変数の型から 'T'の型が推測されます。 – Thomas

+0

@Tomas、まあ、実際に私はこのコードを使ってチェックしました: 'public class GenericTest { static class MyType {} 静的クラスExtTypeはMyType {}を拡張します。 静的クラスMyClass { MyType myField = new MyType(); public T foo(){ return(T)myField; 。 }} パブリック静的無効メイン(文字列[] args){ ExtType T =(新しいMyClassの())のfoo();System.out.println(t); }} 'とClassCastExceptionが唯一のfoo()'実行自体が例外なく実行 'FOO() 'T''の結果とを '割り当てに起こります。これは 'foo()'にキャストされていないことを意味します。 – dhblah

1

あなたは関数宣言で「T」を定義します。また、Tは、それが保持し、リターンタイプかを定義します。あなたの場合、パラメータを渡して、同じ戻り値の型を予期していて、 'T'をExtTypeの拡張として宣言しています。したがって、eclipseは警告を生成しません。

関連する問題