26

假设我有以下课程:

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

我将如何检查o与 相同的课程E

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

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

我也宁愿不尝试进行强制转换,然后在失败时捕获产生的异常。

4

4 回答 4

27

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

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;
    }
}

如果您想要“instanceof”关系,请使用Class.isAssignableFrom而不是Class比较。注意,E将需要是非泛型类型,出于同样的原因Test需要Class对象。

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

于 2008-09-09T11:16:30.907 回答
10

我一直使用的方法如下。这是一种痛苦,有点难看,但我还没有找到更好的。您必须在构造时传递类类型,因为当泛型被编译时,类信息会丢失。

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);
    }
}
于 2008-09-09T11:09:35.650 回答
2

我只能让它像这样工作:

public class Test<E> {  

    private E e;  

    public void setE(E e) {  
        this.e = e;  
    }

    public boolean sameClassAs(Object o) {  

        return (o.getClass().equals(e.getClass()));  
    }

    public boolean sameClassAs2(Object o) {  
        return e.getClass().isInstance(o);  
    }
}
于 2008-09-09T11:03:43.683 回答
-1

我只是想做同样的事情,我刚刚意识到的一个巧妙的技巧是你可以尝试强制转换,如果强制转换失败,则会抛出 ClassCastException。你可以抓住它,然后做任何事情。

所以你的 sameClassAs 方法应该如下所示:

public boolean sameClassAs(Object o) {
    boolean same = false;
    try {
        E t = (E)o;
        same = true;
    } catch (ClassCastException e) {
        // same is false, nothing else to do
    } finally {
        return same;
    }
}
于 2009-04-19T11:11:13.513 回答