【问题标题】:Comparing Parameter Types比较参数类型
【发布时间】:2014-07-04 05:27:24
【问题描述】:

我有一个方法用于将参数类型与给定的参数类型进行比较。

private boolean typesMatch(Class<?>[] one, Object[] two)
{
    if(one.length != two.length)
        return false;

    for (int i = 0; (i < one.length)&&(i < two.length); i++)
        if(!one[i].equals(two[i].getClass()))
            return false;

    return true;
}

例如,在一个[] 中,可能有String, boolean。但是,在第二个中,有String, Boolean。你看到我的问题了吗?当它比较 boolean 和 Boolean 时,它返回 false。我该如何解决这个问题,这样我就不必为每个原始类型使用“if 语句”来解包它们?

编辑:我的意思是解开第二个数组中的包装类,使其与第一个数组中的原始类型相当。

最初,数组 2 中的布尔对象作为原始布尔值添加到其中。

【问题讨论】:

    标签: java casting comparison type-conversion


    【解决方案1】:

    这应该可以解决您的问题:

    private static boolean typesMatch(Class<?>[] one, Object[] two)
        {
            if(one.length != two.length) {
                return false;
            }
    
            for (int i = 0; (i < one.length)&&(i < two.length); i++){
                if ((one[i].isPrimitive() && two[i].getClass().getSimpleName().equalsIgnoreCase(one[i].getName())) ||
                        (two[i].getClass().isPrimitive() && one[i].getSimpleName().equalsIgnoreCase(two[i].getClass().getName()))) {
                    return true;
                }
                if(!one[i].equals(two[i].getClass())) {
                    return false;
                }
            }
    
            return true;
        }
    

    【讨论】:

    • 第二个数组总是有包装的原语。因此,在该数组中的对象上使用 .isPrimitive() 将始终返回 false。我将对其进行更改,以便仅当第一个数组中的类型是原始类型时才会比较它们的名称。但是你的名字比较的想法很巧妙。 +1
    【解决方案2】:

    您不需要为每个原语使用if 语句。

    只需检查two[i].getClass() 是否是原语之一,然后调用将返回其包装类的函数。

    // safe because both Long.class and long.class are of type Class<Long>
      @SuppressWarnings("unchecked")
      private static <T> Class<T> wrap(Class<T> c) {
        return c.isPrimitive() ? (Class<T>) WRAPPERS_TO_PRIMITIVES.get(c) : c;
      }
    
      private static final Map<Class<?>, Class<?>> WRAPPERS_TO_PRIMITIVES
        = new ImmutableMap.Builder<Class<?>, Class<?>>()
          .put(Boolean.class, boolean.class)
          .put(Byte.class, byte.class)
          .put(Character.class, char.class)
          .put(Double.class, double.class)
          .put(Float.class, float.class)
          .put(Integer.class, int.class)
          .put(Long.class, long.class)
          .put(Short.class, short.class)
          .put(Void.class, void.class)
          .build();
    

    以上代码取自Simple way to get wrapper class type in Java

    【讨论】:

    • 这与我想要的相反。查看我的帖子的编辑。
    • 所以我颠倒了 map 中的键和值。
    • 我想我可以使用这个(我想)。地图和散列地图是我没有学过的东西。我想今天就是这一天!
    • 这仍然是我想要避免的。如果你明白我的意思,我不想写那样零碎的代码。
    • 我知道你的意思,但我怀疑是否有更清洁的方法来实现这一目标。也许会有更多的答案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2012-09-14
    • 2010-12-23
    相关资源
    最近更新 更多