使用通配符不要求类型转换,但使用泛型要求 java

Use of wildcard not ask for type cast but use of generics ask in java

以下是使用的方法? (通配符)

public static void doSomething(Set<?> set)
{
    Set<?> copy = new HashSet<Object>(set);
    for (Object o : copy)
    {
        System.out.println(o);
    }
}

使用泛型的以下方法

public static <T> void doSomething(Set<T> set)
{
    Set<T> copy = (Set<T>) new HashSet<Object>(set); //Type safety: Unchecked cast from HashSet<Object> to Set<T>
    for (T t : copy)
    {
        System.out.println(t);
    }
}

两者都工作正常,但如评论中所示,第二个示例显示警告。

为什么需要使用泛型而不是通配符进行类型转换?

请帮我理解这个概念!谢谢 ;)

不使用对象,而是直接使用Hashset 的通用类型。此外,您不需要转换回 Set,因为 HashSet 实现了 Set。所以这应该有效:

  public static <T> void doSomething(Set<T> set)
    {
        Set<T> copy = new HashSet<T>(set);
        for (T t : copy)
        {
            System.out.println(t);
        }
    }
Set<?> copy = new HashSet<Object>(set);

以上语句,您使用的是通配符 ?,这意味着 Any Type 的集合。不需要显式类型转换。现在,如果在创建 HashSet 时它不是 Object,那么它将显示编译时错误。 你可以尝试自己玩来加深理解:)

Set<T> copy = (Set<T>) new HashSet<Object>(set);

以上语句表示T类型的集合。因此,需要显式类型转换。 没有办法告诉 T 总是 Object 类型。因此它显示类型安全警告。

OracleJavaDocs