是否可以从泛型方法返回原始对象?

时间:2014-08-08 14:47:05

标签: java generics collections generic-method

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

3 个答案:

答案 0 :(得分:1)

术语明智,对象不是raw。参考值的类型可以是。方法返回的值的类型必须与方法的返回类型兼容。在emptySet方法中,这是因为演员。

在任何情况下,客户端永远不会看到调用中发生了什么,他们都知道方法调用表达式具有基于其调用上下文的类型。

答案 1 :(得分:0)

如果您确实需要使用原始对象创建一个集合,请考虑使用通配符创建它。

Set<?> set = Collections.emptySet();

答案 2 :(得分:0)

是的,具体的例子是可能的:

Collections类有以下公共字段:

Collections.EMPTY_SET

一般看起来你不能使用原始版本的泛型方法。编译器无论如何都会尝试评估类型。