从Colletions
类:
@SuppressWarnings("unchecked")
public static final <T> Set<T> emptySet() {
return (Set<T>) EMPTY_SET;
}
Collections.emptySet() return `Set<Object>`
此行为与泛型类不同。如果我实例化没有<T>
的泛型类,我使用原始对象。
我注意到这个方法接受通用集失败后编译错误:
public class GenericMethodRaw {
public static void main(String [] args){
Set set = Collections.emptySet();
method(set); //fine
method(Collections.emptySet()); //compilation error here
Set<String> set1 = Collections.emptySet();//fine compilation
}
public static void method(Set<String> strings){}
}
编译器消息:
java: method method in class GenericMethodRaw cannot be applied to given types;
required: java.util.Set<java.lang.String>
found: java.util.Set<java.lang.Object>
reason: actual argument java.util.Set<java.lang.Object> cannot be converted to java.util.Set<java.lang.String> by method invocation conversion
答案 0 :(得分:1)
术语明智,对象不是raw
。参考值的类型可以是。方法返回的值的类型必须与方法的返回类型兼容。在emptySet
方法中,这是因为演员。
在任何情况下,客户端永远不会看到调用中发生了什么,他们都知道方法调用表达式具有基于其调用上下文的类型。
答案 1 :(得分:0)
如果您确实需要使用原始对象创建一个集合,请考虑使用通配符创建它。
Set<?> set = Collections.emptySet();
答案 2 :(得分:0)
是的,具体的例子是可能的:
Collections
类有以下公共字段:
Collections.EMPTY_SET
一般看起来你不能使用原始版本的泛型方法。编译器无论如何都会尝试评估类型。