15.8 擦除的补偿

探讨Java泛型中类型擦除的概念,解释为何不能在运行时创建泛型类型的实例,以及如何通过类型捕获来判断对象是否为特定泛型类型的实例。演示了在类型擦除下,使用Class对象来实现类型检查的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • new T() 无法实现,因为擦除,还因为不确定T有无参构造函数;
package chapter15._8;

public class Erased<T> {

    private final int SIZE = 100;

    public static void f(Object arg) {
        // if (arg instanceof T) {} // error
        // T var = new T(); // error
        // T[] array = new T[SIZE]; // error
        // T[] array = (T)new Object[SIZE]; // error
    }

}

package chapter15._8;

class Building {}
class House extends Building {}

public class ClassTypeCapture<T> {

    // 类型标签
    Class<T> kind;

    public ClassTypeCapture(Class<T> kind) {
        this.kind = kind;
    }

    public boolean f(Object arg) {
        // 如果arg可以转型成kind,返回true
        return kind.isInstance(arg);
    }

    public static void main(String[] args) {
        ClassTypeCapture<Building> ctt1 = new ClassTypeCapture<Building>(Building.class);
        System.out.println(ctt1.f(new Building()));
        System.out.println(ctt1.f(new House()));

        ClassTypeCapture<House> ctt2 = new ClassTypeCapture<House>(House.class);
        System.out.println(ctt2.f(new Building()));
        System.out.println(ctt2.f(new House()));
    }

}

输出

true
true
false
true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值