次のあまり役に立たないコードがあるとします。
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 つの引数の間で共通の型を推測できないためです ( Object
2 番目のパラメーターは . でなければならないため、推測できませんCollection
)。
Java は2 つの引数の間での共通の型を推測するため、の呼び出しplain()
はコンパイラ エラーではありません。Object
私は最近、に似たメソッド署名を持つコードに出くわしましたplain()
。
私の質問はこれです:
plain()
さんの署名は何かに役立ちますか?
おそらく、そのコードを書いた人は、plain()
の署名がコンパイル時に両方のパラメーターが同じ型を持つことを強制すると考えていましたが、明らかにそうではありません。
plain()
両方のパラメーターを s に定義するだけでなく、署名を使用してメソッドを作成することとの違いや利点はありますObject
か?