当使用Type而不是Class <t>时,有没有办法避免使用泛型的转换

时间:2016-09-15 14:17:36

标签: java generics

说你有这段代码:

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();
}

有没有办法避免这种丑陋的未经检查的演员?

3 个答案:

答案 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类型系统中的一个错误。