Java泛型方法擦除

如果使用无界类型参数,则Java编译器将使用Object替换通用类型中的类型参数,如果绑定参数用作方法参数,则使用参数的类型。

示例

创建一个名称为:GenericMethodsErasure.java 文件,并编写以下代码 -

package com.zyiz.demo3;

public class GenericMethodsErasure {
    public static void main(String[] args) {
        Box<Integer> integerBox = new Box<Integer>();
        Box<String> stringBox = new Box<String>();

        integerBox.add(new Integer(1992));
        stringBox.add(new String("Hello World"));

        printBox(integerBox);
        printBox1(stringBox);
    }

    private static <T extends Box> void printBox(T box) {
        System.out.println("Value: " + box.get());
    }

    private static <T> void printBox1(T box) {
        System.out.println("Value: " + ((Box) box).get());
    }
}

class Box<T> {
    private T t;

    public void add(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

在本示例中,java编译器将用Object类替换T类型,而在类型擦除之后,编译器会为以下代码生成字节码。

package com.zyiz.demo3;

public class GenericMethodsErasure {
    public static void main(String[] args) {
        Box integerBox = new Box();
        Box stringBox = new Box();

        integerBox.add(new Integer(1992));
        stringBox.add(new String("Hello World"));

        printBox(integerBox);
        printBox1(stringBox);
    }

    // Bounded Types Erasure
    private static void printBox(Box box) {
        System.out.println("Value: " + box.get());
    }

    // Unbounded Types Erasure
    private static void printBox1(Object box) {
        System.out.println("Value: " + ((Box) box).get());
    }
}

class Box {
    private Object t;

    public void add(Object t) {
        this.t = t;
    }

    public Object get() {
        return t;
    }
}

在这两种情况下,执行输出结果是相同的 -

Value: 1992
Value: Hello World

上一篇:Java泛型无界类型擦除

下一篇:Java泛型不能使用原始类型

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程