seg*_*ult 8 java generics type-inference
鉴于以下不是非常有用的代码:
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>());
}
}
Run Code Online (Sandbox Code Playgroud)
(如果错了,请纠正我的理解!)
第二次调用fancy()
是编译器错误,因为Java无法推断两个参数之间的任何常见类型(无法推断,Object
因为第二个参数必须是Collection
.)
该呼叫plain()
是不是一个编译器错误,因为Java推断的普通型Object
两个参数之间.
我最近遇到了类似于方法签名的代码plain()
.
我的问题是:
是plain()
的签名什么有用的东西?
也许编写该代码的人认为plain()
签名会强制两个参数在编译时具有相同的类型,显然不是这种情况.
使用签名编写方法是否有任何区别或好处,plain()
而不仅仅是将两个参数定义为Object
s?
虽然编译器不会推断出人们可能想要的泛型类型,但它会强制执行显式指定的类型约束。以下调用会导致类型错误。
this.<String>plain("", new ArrayList<Integer>()); /* Compiler error. */
Run Code Online (Sandbox Code Playgroud)
Test 类型的参数化方法 <String>plain(String, String) 不适用于参数 (String, ArrayList<Integer>)