【问题标题】:JAVA - Primitive type VS Object typeJAVA - 原始类型 VS 对象类型
【发布时间】:2016-03-30 07:06:31
【问题描述】:

我有以下变量:

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

可以动态比较吗?这意味着我想获取第二个变量的原始类型并将其与第一个变量进行比较。

【问题讨论】:

标签: java class reflection types


【解决方案1】:

没有办法从Integer.class 中取出int.class,反之亦然,Java 内置。您必须手动进行比较。

  • Integer.class.isAssignableFrom(int.class) 及其倒数返回 false,因为它不考虑自动装箱(这是编译器生成的代码)
  • 您正在处理原始类型的唯一标志是 Class#isPrimitive(),它为 int.class(也为 void.class)返回 true,但对于 int[].classInteger.class 则不返回 true。
  • Integer.TYPE 和类似名称是 int.class 的别名,..

最聪明的方法是使用库或编写几行涵盖所有情况的代码。只有 8 个(booleanbytecharshortintlongfloatdouble)原始类型(+void)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多