以下代码会产生“未检查或不安全的操作”警告,如何在不引起警告的情况下投入Object
o
以键入T
?我知道我可以压制警告,但我想知道“正确”的方式。如何转换为泛型?
public class MyType<T> {
T cast(Object o) {
return (T)o; //<--- what causes the warning
}
}
以下代码会产生“未检查或不安全的操作”警告,如何在不引起警告的情况下投入Object
o
以键入T
?我知道我可以压制警告,但我想知道“正确”的方式。如何转换为泛型?
public class MyType<T> {
T cast(Object o) {
return (T)o; //<--- what causes the warning
}
}
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);
你在做什么不是类型安全的,所以是的,你会得到一个警告,它不是类型安全的。 –