【问题标题】:Is there a way to compare a primitive type with its corresponding wrapper type?有没有办法将原始类型与其相应的包装类型进行比较?
【发布时间】:2019-06-24 01:33:48
【问题描述】:

我有一个对象数组列表ArrayList<Object> arrList,其中包含各种原语的包装类以及参数类型Parameter[] parameters 的数组

两者具有相同数量的元素。我想循环遍历参数的元素并比较它们的类型与arrList中的相同。

我意识到有很多方法可以将 int 与 Integer.lang.Integer 进行比较,例如简单地将 int 转换为 Integer,然后进行比较,但我的 Parameter[] 有整数、布尔值、浮点数等,而我的 ArrayList 有整数、浮点数,布尔值等,所以我并不总是确定值是什么。 我不认为我真的了解原语是如何表示的。例如,我假设以下语句会返回 true,但事实并非如此:

 Boolean bool=true;                                  
 System.out.println(boolean.class==bool.getClass()); 

我有这个相关的代码:

    for(int i=0; i<parameters.length; i++){
        if(parameters[i].getType()==arrList.get(i).getClass()){
           doSomething();
        }
    }

但即使比较 boolean.class 和 Boolean.getClass(),比较总是返回 false

感谢任何帮助/建议

【问题讨论】:

  • 一个Boolean 对象将返回Boolean.classgetClass()
  • boolean.classBoolean.class 这两个类是不同的。 boolean.class 通常仅在使用反射时使用,因为它表示原始 boolean 参数和返回类型。

标签: java types wrapper


【解决方案1】:

您可以使用每个包装类都有的静态字段TYPE。 (source)

for(int i=0; i<parameters.length; i++){
    if(parameters[i].getType()==arrList.get(i).getClass().getField("TYPE").get(null)){
       doSomething();
    }
}

您也可以比较小写的类名,但您必须将 intchar 作为特殊情况处理。

或者,您可以在原始类和包装类之间创建Map&lt;Class, Class&gt;

【讨论】:

  • 谢谢,这完美解决了问题。不太了解.get(null) 调用,但它有效。
  • @M.Santos。我们在这里使用反射。 getField() 调用返回 Field。通常,一旦你有了你的字段,你就可以通过myField.get(myInstance) 获得它的价值。但是这里我们没有实例,因为它是一个静态字段。如the documentation of get() 中所写: 如果底层字段是静态字段,则忽略 obj 参数;它可能为空。
猜你喜欢
  • 2019-05-28
  • 2023-03-17
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多