2012-03-29 18 views
0

私は最近、ジェネリックで読んでてきた、と私はこの方法に出くわした:protected<V>がありますなぜのJava - ジェネリックメソッド

あなたが見
protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) { 
     return new ExceptionHandlingFutureTask<V>(callable, task); 
    } 

は、私が理解しています。私が理解できないのは、RunnableScheduledFutureの後に<V>が再び存在する理由です。私はこの特定の方法を外した<V>をコンパイルし、エラーはありませんでした。それではなぜ作家が最初にそれをそこに置くことにしたのですか?

答えて

2

は、一般的に、彼らは消去を経由して、Javaで実装されているので、あなたが常に、「エラーなし」とジェネリックを削除することができます話すので、実際のコンパイルされたコードだけでキャストの警告を回避したいと考えていますのでとにかく生のクラスを指します。 (つまり、コンパイラを幸せにするためにいくつかのキャストを挿入する必要があります)。後者の例に照らして

は、未来からの一般的なパラメータを除去することで、あなたは「何かを返します未来」に「Vを返します。未来」からそれを回してきました。ジェネリックパラメータがなければ、結果を必要な型にキャストする必要があり、コンパイラはこれの正当性をチェックすることができません。

ArrayList<Integer>の代わりにArrayListという生のものを使用できることと同じです。どちらも「うまくいく」が、後者はより洗練され、理解しやすく、コンパイラによってタイプチェックされ、手動キャスティングを必要としない。

+0

Aaaaaaah、よろしく!どうもありがとう。今多くの意味がある:) –

1

RunnableScheduledFuture<V>を返すように指定しているため、入力したCallableと同じタイプのVが返されます。

あなたが<V>を削除する場合は、この方法

RunnableScheduledFuture<String> rsf = decorateTask(Callable<Integer> callable, RunnableScheduledFuture<Integer> task); 

でメソッドを呼び出した場合、あなたは何のエラーを取得していないだろう。しかし、あなたは<V>を削除しない場合、これはあなたのコンパイラエラーになります。

0

彼は

ExceptionHandlingFutureTask<V> var = decorateTask(...); 
0

RunnableScheduledFutureにはパラメータ化タイプが必要なためです。コードからパラメータ化された型を取り除くことができます(したがって、生の型になる)場合でも、クラス定義はパラメータ化されます。

パラメータ化された型を削除すると、後で適切な型に型キャストする必要があります。

関連する問題