当前位置: 首页 > 面试题库 >

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

王才英
2023-03-14
问题内容

我有一段代码需要在方法中传递字段的类。由于代码的机制,我只能处理引用对象,而不能处理基元。我想要一种简单的方法来确定一个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);

除我需要显式检查所有原始类型并将其与适当的包装器类交换外,该方法工作正常。现在我知道没有那么多原始类型,简单地将它们全部列出就不会有问题,但是我想知道是否有一种更简单,更优雅的方法。


问题答案:

我在回答中使用了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()和其他一些附带的东西。



 类似资料:
  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

  • 我有以下xml类型: FaxNumber类型如下所示: 生成的xml应该如下所示: 运行JAXB XJC从XSD生成java类时,它会生成以下类: 但是,我想绑定FaxNumber到这样的复合类: 有没有办法在JAXB绑定xml中定义这样的绑定? 注意:不幸的是,我无法控制并且无法更改XSD

  • 本文向大家介绍Java Float包装器类,包括了Java Float包装器类的使用技巧和注意事项,需要的朋友参考一下 Float是提供的包装类,用于包装float基本值。 让我们创建一个带有float原语的Float对象。 现在让我们从字符串创建一个Float对象。 下面的示例显示了上面讨论的两种输出方法。 示例 输出结果

  • 问题内容: 我只是想知道大多数人如何从Java文件中获取mime类型?到目前为止,我已经尝试了两个工具:。 第一个给我内存异常,第二个没有正确关闭其流。我只是想知道其他人是否拥有他们使用和正常工作的方法/库? 问题答案: 不幸, 之所以无法使用,是因为URL的这种使用将文件锁定了,例如,它是不可删除的。 但是,你有: 还有以下内容,其优点是不仅可以使用文件扩展名,而且还可以浏览内容 但是,正如上面

  • 问题内容: 我有一个列表,程序是这样的:。有什么方法可以使用T变量获取类的名称(因此我可以从内部知道T是否为String,Socket等)? 编辑:没关系,在这里找到了答案。 问题答案: 简短答案 :您不能。 长答案 : 由于使用Java实现泛型的方式,泛型T在运行时不会保留。您仍然可以使用私有数据成员: 用法示例:

  • 问题内容: 我在使用泛型时遇到麻烦。给出以下示例: 什么 ???应该 ? 不工作… 也不。 不工作… 如果有Java泛型专家,我需要帮助…:/ 问题答案: 由于类型擦除,您可能无法获得除外。你将不得不使用不安全的类型转换投下的-具体而言,将做的工作。