以下代码会产生“未经检查或不安全的操作”警告,如何在不引起警告的情况下将Object
o
转换为T
类型?我知道我可以压制警告,但我想知道“正确”的方式。
public class MyType<T> {
T cast(Object o) {
return (T)o; //<--- what causes the warning
}
}
答案 0 :(得分:8)
Type erasure。您可以将Class<T>
作为参数传递,并使用它。像,
T cast(Class<T> cls, Object o) {
return cls.cast(o);
}
或甚至
public class MyType {
public static <T> T cast(Class<T> cls, Object o) {
return cls.cast(o);
}
}
你可以像
一样打电话int t = MyType.cast(Integer.class, 10);
或者,但在同一行,您可以在构造函数中传递Class
,如
public class MyType<T> {
public MyType(Class<T> cls) {
this.cls = cls;
}
private Class<T> cls;
T cast(Object o) {
return cls.cast(o);
}
}
然后像
一样使用它MyType<Integer> myType = new MyType<>(Integer.class);
int t = myType.cast(10);