8

次のあまり役に立たないコードがあるとします。

package com.something;

import java.util.ArrayList;
import java.util.Collection;

//Not a generic class!
public class Test {

  public <T> void plain(T param1, T param2) {}
  public <T> void fancy(T param1, Collection<T> param2) {}

  public void testMethod() {

    //No error
    fancy("", new ArrayList<String>());

    //Compiler error here!
    fancy("", new ArrayList<Integer>());

    //No error
    plain("", new ArrayList<Integer>());

  }

}

(間違っている場合は私の理解を修正してください!)

の 2 番目の呼び出しfancy()はコンパイラ エラーです。Java は 2 つの引数の間で共通の型を推測できないためです ( Object2 番目のパラメーターは . でなければならないため、推測できませんCollection)。

Java は2 つの引数の間での共通の型を推測するため、の呼び出しplain()はコンパイラ エラーではありません。Object

私は最近、に似たメソッド署名を持つコードに出くわしましたplain()

私の質問はこれです:

plain()さんの署名は何かに役立ちますか?

おそらく、そのコードを書いた人は、plain()の署名がコンパイル時に両方のパラメーターが同じ型を持つことを強制すると考えていましたが、明らかにそうではありません。

plain()両方のパラメーターを s に定義するだけでなく、署名を使用してメソッドを作成することとの違いや利点はありますObjectか?

4

3 に答える 3

4

コンパイラは、意図したジェネリック型を推測しませんが、明示的に指定された型制約を適用します次の呼び出しは型エラーになります。

this.<String>plain("", new ArrayList<Integer>()); /* Compiler error. */

Test 型のパラメーター化されたメソッド <String>plain(String, String) は、引数 (String, ArrayList<Integer>) には適用できません

于 2012-07-16T23:46:39.007 に答える
3

ある種のドキュメントとして機能すると言えるので、両方の引数が同じ型であるとユーザーが期待していることをユーザーが知ることができます。もちろん、任意の 2 つのオブジェクトはある程度同じ型 (それらはすべてObject) であるため、意味のないステートメントです。

要するに、それは役に立たない署名です。

もちろん、plaintype が返された場合T、それは別の話になります。

于 2012-07-16T22:55:55.227 に答える
1

fancy() の 2 回目の呼び出しはコンパイラ エラーです。これは、Java が 2 つの引数の間で共通の型を推測できないためです (2 番目のパラメーターは Collection でなければならないため、Object を推測できません)。

まあ、これが理由かどうかはわかりませんが、その理由は、のジェネリック型TCollection<T>不変であり、その値が最初のパラメーターの型を決定するためだと思いますT

たとえば、これは有効です。

fancy("", new ArrayList<CharSequence>()); //compiles Ok

すべてだからStringですCharSequencesCharSequence型が から推論されると、最初のパラメータは であることが期待されますArraysList<CharSequence>

ただし、これは有効ではありません。

fancy((CharSequence)"", new ArrayList<String>()); //compiler error

最初のパラメーターの型は であることが期待されておりString、すべてCharSequencesが実際に型であることを保証することはできませんStringよね?

したがって、私の知る限り、型に互換性がない理由は、この場合のジェネリックの性質によるものであり、2 番目の型が であるという事実によるものではありませんCollection

于 2012-07-16T23:17:58.483 に答える