Java Generics:将Object o的类与进行比较
假设我有以下课程:
public class Test { public boolean sameClassAs(Object o) { // TODO help! } }
我如何检查o
与E
是同一类?
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; } }