代码之家  ›  专栏  ›  技术社区  ›  kgrad

如何使用反射比较类?

  •  9
  • kgrad  · 技术社区  · 16 年前

    我尝试使用反射来确定类的类类型,然后做一些特定的事情。例如,如果类是double,则使用double特定的方法。

    我想用

    
      if(f.getClass() == Double.class)
    

    但是,我得到一个编译器错误:

    “不兼容的操作数类型class<capture 1-of?”扩展字段和类<double>。

    正确的方法是什么?

    编辑:为了更清楚

    F是字段类型。通过回路中的反射获得

    
      (Field f : instance.getDeclaredFields())
    
    5 回复  |  直到 11 年前
        1
  •  7
  •   StaxMan    16 年前

    有趣的错误消息(我不知道“==”操作员会检查这些错误)。 但基于此,我怀疑你的比较是错误的:你试图看看场类(理论上是它的超类,但理论上只有场是最终的)是否和double.class相同,而double.class是不可能的。

    所以:是的,如果你给出了正确的论据,比较就可以了。所以我怀疑你想这样做:

    if(f.getType()==double.class)

    相反。既然双关是最后一节课,那就行了。否则,“isassignablefrom”会更合适。

        2
  •  3
  •   Roman    16 年前

    如果有对象,则使用

    if (f instanceof Double) { }
    

    另一个有趣的事情是方法Isassignable来自:

    if (f.getClass().isAssignableFrom (Double.class)) { }
    

    但总的来说,这是一种糟糕的风格。使用多态性来实现依赖于类类型的逻辑。


    答:如双联工程实例良好。

    你可能写了这样的东西:

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

    …这个很好用

        3
  •  1
  •   kgrad    16 年前

    您应该使用getType()来获取底层类型,而不是get类。 getType()根据需要返回基础类型的类。

    代码如下:

    
      if(f.getType().equals(Double.class))
    
        4
  •  1
  •   Michael Myers KitsuneYMG    16 年前

    最简单的方法是

    if (f.getClass().equals(Double.class))
    

    编辑: 啊,现在我看到问题了。您得到的错误是因为(作为泛型的结果)编译器可以告诉您类永远不会是相等的。( Field.class 不能平等 Double.class )使用.equals()将其转换为警告而不是错误,但它仍然是错误的代码。

    Field.getType() 提供字段的类型。由于在编译时无法知道这一点,因此如果使用 == 接线员和你原来一样。

        5
  •  0
  •   Jiang Run    11 年前

    以下代码段应该可以完美地工作:

    if (f.getType() == Double.TYPE)
    

    顺便说一下,都不 == 也不 equals 作品 根据我的测试类型(JRE7)