在 Java 中获取包装器类类型的简单方法

2022-09-01 04:45:10

我有一段代码,我需要在方法中传递字段的类。由于我的代码的机制,我只能处理引用对象,而不能处理基元。我想要一种简单的方法来确定 's 类型是否为基元,并将其与适当的包装类交换。所以在代码中,到目前为止我所做的是这样的:Field

Field f = getTheField(); // Dummy method that returns my Field
Class<?> c = f.getType();
if (c == int.class) {
    c = Integer.class;
}
else if (c == float.class) {
    c = Float.class;
}
// etc
myMethod(c);

这工作正常,除了我需要显式检查所有基元类型并将其与适当的包装类交换的事实。现在我知道没有那么多的基元类型,简单地列出它们也不是问题,但我想知道是否有一种更简单,更优雅的方法来做到这一点。


答案 1

Apache Commons Lang有一个实用程序方法来做到这一点(ClassUtils.primitiveToWrapper()),这在幕后同样丑陋,但至少你可以假装它很好。


答案 2

我在答案中使用Google Collections Library,因为我被这样宠坏了,但是如果您愿意,您可能会看到如何使用普通的HashMaps来做到这一点。

  // 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>) PRIMITIVES_TO_WRAPPERS.get(c) : c;
  }

  private static final Map<Class<?>, Class<?>> PRIMITIVES_TO_WRAPPERS
    = new ImmutableMap.Builder<Class<?>, Class<?>>()
      .put(boolean.class, Boolean.class)
      .put(byte.class, Byte.class)
      .put(char.class, Character.class)
      .put(double.class, Double.class)
      .put(float.class, Float.class)
      .put(int.class, Integer.class)
      .put(long.class, Long.class)
      .put(short.class, Short.class)
      .put(void.class, Void.class)
      .build();

奇怪的是,JDK中没有任何东西存在,但实际上没有任何存在。

编辑:我完全忘记了我们发布了这个:

http://google.github.io/guava/releases/21.0/api/docs/com/google/common/primitives/Primitives.html

它具有 wrap() 方法,以及 unwrap() 和其他一些附带的东西。