Java 为什么这不安全?
我有以下实用程序类:Java 为什么这不安全?,java,generics,Java,Generics,我有以下实用程序类: public class MyUtils{ public static <T> List<? extends T> getList(Class<T> clazz){ //returning some list } } 公共类MyUtils{ 公共静态列表>值(){ return(ListgetList()返回一个未知的类型的列表。您正在将其强制转换为列表MyClass。getList应该是MyClass
public class MyUtils{
public static <T> List<? extends T> getList(Class<T> clazz){
//returning some list
}
}
公共类MyUtils{
公共静态列表>值(){
return(ListgetList()
返回一个未知的类型的列表。您正在将其强制转换为列表MyClass。getList
应该是MyClass。value
,对吗?@CoronA当然,我会在一分钟内修复它。啊,我明白了。所以强制转换的安全性本质上取决于getList(Class clazz)的实现
。我的意思是,如果它是按如下方式实现的公共静态列表如果是这样的实现,您可以抑制警告,并且在运行时不会出现问题。但这就违背了使用类型安全泛型类型的要点。如果您的方法应该总是返回列表,那么它的返回类型应该是List,而不是List(如果它总是返回)edList
,cast(ListAfaik:通过将MyClass.class作为参数传递,您无法指定列表中MyClass实例的泛型类型。您需要类似Jackson的TypeReference:
public class MyClass<T>{
public static List<MyClass<?>> values(){
return (List<MyClass<?>>) MyUtils.getList(MyClass.class); //Warning, unchecked cast.
}
}
List<MyClass<? extends Integer>> lst = MyClass.values(); //compile-error
List<MyClass<?>> dsss = MyClass.values();