public class Main<T> {
T obj;
public Main(T input) {
this.obj = input;
}
void set(T input) {
this.obj = input;
}
void print() {
System.out.println(this.obj);
}
public static void main(String[] args) {
Main<Integer> tester = new Main<>(2);
Main test = tester;
test.print();
test.set(3);
test.print();
}
}
在上面的代码中,test.set(3)给我一个警告“未经检查的调用'set(T)'作为原始类型'Main'的成员”。 什么是未检查的调用以及为什么得到它,即使set方法起作用并且在执行print语句之后,也会打印3。
您还没有告诉编译器,Main
变量指的是哪种test
。就编译器而言,它可以是Main<Integer>
或Main<String>
或Main<RahatsCrazyClass>
。因此,编译器无法保证test.set(3)
有意义-您可能正在尝试在Integer
内设置Main<String>
对象。
该警告告诉您,编译器遇到了无法保证其正确性的情况。您应该避免发生这种事情。最好将test
声明为Main<Integer>
,而不是仅仅声明为Main
。
您明显地违反了泛型的目的,泛型的目的是隐式地使用Object
类型的参数来专门化泛型类。在这种情况下,您将击败raw type
泛型上的类型安全和setter方法,由于后期绑定,在编译时将不对其进行检查。编译器根本不知道在编译时会将哪种类型的值传递给setter方法,因为没有类型检查。
除非您确实必须这样做,否则应该始终在通用类中不要使用raw type专业化。