有一个类:
static class Test<T> {
T t;
<P> P get(P p) {
return p;
}
}
如果它的方法是这样调用的,那么一切都很好:
Test<String> test = new Test();
int i = test.get(1);
如果从类中删除泛型类型,则会发生错误:
Test test = new Test();
int i = test.get(1);//error - java.lang.Object cannot be converted to int
为什么会有这样的行为?全局泛型类型 T 与方法 P 中的内容有何关联?
类级别的类型 T 与方法中使用的类型 P 无关。
然而,如果一个声明为泛型(generic)的类没有提供任何关于泛型类型的信息,例如在 的情况下
Test test = new Test()
,这样的类在编译阶段“变成”了一个“脏”类(原始类型)并且代码将对应它:因此,编译器在尝试将
Object
字符串中的对象分配给 number 时会感到愤慨int i = test.get(1);
,这实际上是由错误报告的:error: incompatible types: Object cannot be converted to int
。如果你真的想编译这个杰作而不指定类中的类型,只需使用强制转换:
一个类似的例子是对主要 SO 的回答:使用无参数完全禁用泛型。