给定以下不是很有用的代码:
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 无法推断两个参数之间的任何公共(public)类型(无法推断 Object
,因为第二个参数必须是 Collection
。)
对 plain()
的调用不是编译器错误,因为 Java 会在两个参数之间推断出 Object
的公共(public)类型。
我最近发现代码的方法签名类似于 plain()
。
我的问题是:
plain()
的签名有什么用吗?
也许编写该代码的人认为 plain()
的签名会强制两个参数在编译时具有相同的类型,但显然不是这样。
编写带有像 plain()
这样的签名的方法而不是仅仅将两个参数都定义为 Object
有什么区别或好处吗?
最佳答案
虽然编译器不会推断出人们可能想要的泛型类型,但它会强制执行明确指定的类型约束。以下调用导致类型错误。
this.<String>plain("", new ArrayList<Integer>()); /* Compiler error. */
The parameterized method <String>plain(String, String) of type Test is not applicable for the arguments (String, ArrayList<Integer>)
关于java - Java 中的泛型方法和类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11513650/