为什么类的泛型类型参数允许在类内部进行转换

时间:2016-01-08 13:01:00

标签: java generics

为什么编译器没有停止编写此类代码并抛出运行时错误。

public class GenericTest<T,S> {
    T x;
    S y;

    public GenericTest(T x,S y) {
        this.x=x;
        this.y=y;
    }
    void display(){
        System.out.println("Display->"+((int)x)+y); //why does it throw error runtime instead of compile time?
    }
}

调用时显然会失败。

public class Test {

    public static void main(String[] args) {
        GenericTest<String, String> s=new GenericTest<String, String>("Hello","World");
        s.display();

    }
}

为什么允许为泛型类型输入强制转换:

System.out.println("Display->"+((int)x)+y);

1 个答案:

答案 0 :(得分:3)

由于

T

是一个有效的代码,它将产生一个输出。

此外,SObject是无遮盖的泛型,它们相当于ObjectInteger可以投放到Object o = ...; Integer i = (Integer) o;

class GenericTest {
        Object x;
        Object y;

        public GenericTest(Object x,Object y) {
            this.x=x;
            this.y=y;
        }
        void display(){
            System.out.println("Display->"+((int)x)+y); 
        }
}

此外,自Java 7起,object can be cast to int。因此没有编译错误。

您的代码等同于

id