使用通配符不要求类型转换,但使用泛型要求 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
类型。因此它显示类型安全警告。
以下是使用的方法? (通配符)
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
类型。因此它显示类型安全警告。