Java Generics:将 Object o 的类与 <E> 进行比较

2022-09-01 15:49:32

假设我有以下类:

public class Test<E> {
    public boolean sameClassAs(Object o) {
        // TODO help!
    }
}

我该如何检查是否与 ?oE

Test<String> test = new Test<String>();
test.sameClassAs("a string"); // returns true;
test.sameClassAs(4); // returns false;

我无法更改方法签名,因为我覆盖了超类,因此无法选择我的方法签名。(Object o)

我也宁愿不走尝试施法的道路,然后在失败时抓住由此产生的异常。


答案 1

的实例没有关于运行时内容的信息。因此,您需要将 a 传递给 Test 的构造函数。TestEClass<E>

public class Test<E> {
    private final Class<E> clazz;
    public Test(Class<E> clazz) {
        if (clazz == null) {
            throw new NullPointerException();
        }
        this.clazz = clazz;
    }
    // To make things easier on clients:
    public static <T> Test<T> create(Class<T> clazz) {
        return new Test<T>(clazz);
    }
    public boolean sameClassAs(Object o) {
        return o != null && o.getClass() == clazz;
    }
}

如果需要“实例”关系,请使用而不是比较。注意,将需要一个非泛型类型,出于同样的原因需要的对象。Class.isAssignableFromClassETestClass

有关 Java API 中的示例,请参见 和 类似内容。java.util.Collections.checkedSet


答案 2

我一直使用的方法如下。这是一种痛苦,有点丑陋,但我还没有找到更好的。您必须在构造时传递类类型,就像编译泛型时类信息丢失一样。

public class Test<E> {
    private Class<E> clazz;
    public Test(Class<E> clazz) {
       this.clazz = clazz;
    }
    public boolean sameClassAs(Object o) {
        return this.clazz.isInstance(o);
    }
}

推荐