JAVA - 原始类型VS对象类型

时间:2015-12-23 19:38:11

标签: java class reflection types

我有以下变量:

Class a = int.class;
Class b = Integer.class;

是否可以动态比较它?这意味着我想获得第二个变量的原始tye并将其与第一个变量进行比较。

2 个答案:

答案 0 :(得分:1)

无法从int.class中获取Integer.class,反之亦然。你必须手动进行比较。

  • Integer.class.isAssignableFrom(int.class)并且其反转返回false,因为它不考虑自动装箱(这是编译器生成的代码)
  • 您处理基本类型的唯一标志是Class#isPrimitive(),对于int.class(也是void.class)返回true,但不对int[].class,{例如{1}}。
  • Integer.class以及类似Integer.TYPE,...
  • 的别名

最明智的方法是使用库或编写涵盖所有案例的几行代码。只有8个(int.classbooleanbytecharshortintlong,{{ 1}})原始类型(+ float)。

答案 1 :(得分:0)

@Sotirios Delimanolis,@ WhiteboardDev感谢领导。我这样解决了这个问题:

public class Types {

private Map<Class, Class> mapWrapper_Primitive;

public Types(){
    this.mapWrapper_Primitive = new HashMap<>();
    this.mapWrapper_Primitive.put(Boolean.class, boolean.class);
    this.mapWrapper_Primitive.put(Byte.class, byte.class);
    this.mapWrapper_Primitive.put(Character.class, char.class);
    this.mapWrapper_Primitive.put(Double.class, double.class);
    this.mapWrapper_Primitive.put(Float.class, float.class);
    this.mapWrapper_Primitive.put(Integer.class, int.class);
    this.mapWrapper_Primitive.put(Long.class, long.class);
    this.mapWrapper_Primitive.put(Short.class, short.class);
    this.mapWrapper_Primitive.put(Void.class, void.class);
}

public boolean areDerivedTypes(Class type1, Class type2){
    // Checking object types
    if(!type1.isPrimitive() && !type2.isPrimitive()){
        return type1.equals(type2);
    }

    // Checking primitive types
    Class typeA = toPrimitiveType(type1);
    Class typeB = toPrimitiveType(type2);        
    return typeA.equals(typeB);
}

public Class toPrimitiveType(Class type){
    Class value = this.mapWrapper_Primitive.get(type);
    if(value != null){ 
        return value;
    }

    return type;
}
}