我正在尝试使用反射来确定类的类类型,然后执行特定的操作。例如,如果类是double,则使用双特定方法。
我正在尝试使用
if(f.getClass() == Double.class)
但是,我收到编译错误:
“不兼容的操作数类型Class< capture#1-of?extends Field> and Class< Double>”
这样做的正确方法是什么?
编辑:更清楚
f属于Field类型。通过循环反射获得
(Field f : instance.getDeclaredFields())
答案 0 :(得分:7)
有趣的错误消息(我不知道'=='运算符会检查那些)。 但基于它,我怀疑你的比较是错误的:你试图看看Field类(理论上它的超类,但仅在理论上 - Field是final)与Double.class相同,它不能是
所以:是的,比较应该有效,如果你给它正确的论据。所以我怀疑你想做:
if(f.getType()== Double.class)
代替。鉴于Double是最后一堂课,那应该有用。否则“isAssignableFrom”会更合适。
答案 1 :(得分:3)
如果您有对象,请使用
if (f instanceof Double) { }
另一件有趣的事情是方法isAssignableFrom:
if (f.getClass().isAssignableFrom (Double.class)) { }
但总的来说这是一种糟糕的风格。使用多态来实现依赖于类类型的逻辑。
回答评论:f instanceof Double工作正常。
您可能写过这样的内容:
float f = 1.1f;
if (f instanceof Double) { ..}
智能java编译器说你有CE。但是:
public static boolean isInstanceOfDouble (Object obj) {
return obj instanceof Double;
}
psvm (String [] args) {
sout (isInstanceOfDouble (1.1f);
}
..这很好用
答案 2 :(得分:1)
最简单的方法是
if (f.getClass().equals(Double.class))
编辑:啊,现在我看到了问题。你得到的错误是因为(作为泛型的结果)编译器可以告诉这些类永远不会相等(Field.class
不能等于Double.class
)。使用.equals()将其转换为警告而不是错误,但它仍然是错误的代码。
Field.getType()
为您提供该字段的类型。由于在编译时无法识别,因此如果您像原先一样使用==
运算符,则不会出现错误。
答案 3 :(得分:1)
您应该使用getType()来获取基础类型,而不是获取类。 getType()根据需要返回基础类型的类。
代码如下所示:
if(f.getType().equals(Double.class))
答案 4 :(得分:0)
以下代码段应该可以正常运行:
if (f.getType() == Double.TYPE)
BTW,根据我的测试(JRE7),==
和equals
都不适用于数字类型