考虑以下不太有用的代码:
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>());
}
}
如果我理解有误,请纠正!
第二次调用
fancy()
会导致编译错误,因为Java无法推断出两个参数之间的任何公共类型(无法推断出Object
,因为第二个参数必须是Collection
)。对于
plain()
的调用不是编译错误,因为Java推断出了两个参数之间的Object
公共类型。最近我遇到了一个类似于
plain()
的方法签名的代码。我的问题是:
plain()
的签名对于任何事情有用吗?也许编写该代码的人认为
plain()
的签名会在编译时强制要求两个参数具有相同的类型,这显然不是这种情况。编写像
plain()
这样的方法与仅将两个参数定义为Object
之间是否有任何区别或好处?