说你有这段代码:
public <T> T deserialize(String input, Class<T> type) {
return somethingThatRetunsAnInstanceOfT();
}
但是,如果方法接受了Type而不是Class,这是对泛型进行适当的JSON反序列化所必需的,它将如下所示:
public <T> T deserialize(String input, Type type) {
return (T) somethingThatRetunsAnInstanceOfT();
}
有没有办法避免这种丑陋的未经检查的演员?
答案 0 :(得分:2)
如果需要运行时类,则必须显式传递它。您无法从泛型类型中派生它,因为此泛型类型在运行时不可用。这称为“类型擦除”。泛型只能帮助在编译时键入,而不是运行时。
答案 1 :(得分:2)
从第二个示例中,编译器无法识别FlashMessenger
的值。在第一个示例中,您通过将泛型类作为参数来提供该信息。
泛型只是编译时构造。从运行时开始,由于“类型擦除”,你无法获得泛型的价值。
答案 2 :(得分:1)
使用您的第二个签名,可以调用
Type numberType = Integer.class.getGenericSuperclass(); // class java.lang.Number
String str = <String>deserialize("1", numberType);
和somethingThatRetunsAnInstanceOfT
可能会返回Number
。
如果你可以在没有未经检查的强制转换的情况下实现这一点,那将是Java类型系统中的一个错误。