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

假设我有以下课程:

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

我如何检查oE是同一类?

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

我无法从(Object o)更改方法签名,因为我覆盖了一个超类,所以不要选择我的方法签名。

我也不愿意尝试一个演员然后如果失败就抓住结果exception。

Test一个实例没有关于E在运行时的信息。 因此,您需要将Class传递给Test的构造函数。

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

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

有关Java API中的示例,请参阅java.util.Collections.checkedSet等。

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

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

我只能让它像这样工作:

 public class Test { 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); } } 

我只是想做同样的事情,我刚才意识到的一个巧妙的技巧是你可以尝试一个演员,如果演员表失败,将抛出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; } }