Java中未检查的呼叫是什么?

问题描述 投票:0回答:2
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。

java generics call unchecked parameterized-types
2个回答
0
投票

您还没有告诉编译器,Main变量指的是哪种test。就编译器而言,它可以是Main<Integer>Main<String>Main<RahatsCrazyClass>。因此,编译器无法保证test.set(3)有意义-您可能正在尝试在Integer内设置Main<String>对象。

该警告告诉您,编译器遇到了无法保证其正确性的情况。您应该避免发生这种事情。最好将test声明为Main<Integer>,而不是仅仅声明为Main


0
投票

您明显地违反了泛型的目的,泛型的目的是隐式地使用Object类型的参数来专门化泛型类。在这种情况下,您将击败raw type泛型上的类型安全和setter方法,由于后期绑定,在编译时将不对其进行检查。编译器根本不知道在编译时会将哪种类型的值传递给setter方法,因为没有类型检查。

除非您确实必须这样做,否则应该始终在通用类中不要使用raw type专业化。

© www.soinside.com 2019 - 2024. All rights reserved.