以下代碼會產生「未檢查或不安全的操作」警告,如何在不引起警告的情況下投入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);
你在做什麼不是類型安全的,所以是的,你會得到一個警告,它不是類型安全的。 –