【问题标题】:Java: Convert Primitive Class [duplicate]Java:转换原始类 [重复]
【发布时间】:2010-08-13 03:50:10
【问题描述】:

在 Java 中是否可以轻松地将原始类对象转换为对象类对象?给定一个类 Class cl,我想将其转换为没有原语的类。例如。

Class<?> cl = int.class;

...
if (cl.isPrimitive()) {
  cl = Object of primitive
}
...

cl == Integer.class

我想要一种对所有原始类型都执行此操作的方法。显然我可以遍历所有原始类型,但我认为有人可能知道更好的解决方案。

干杯, 最大

【问题讨论】:

  • 只需创建一个映射常量。我认为八个案例不值得打扰。
  • 是的......你是对的。反正已经这样做了,只是想我可能会错过一种为我做这件事的方法。

标签: java reflection class casting


【解决方案1】:

org.apache.commons.lang.ClassUtils.primitiveToWrapper(类)

【讨论】:

    【解决方案2】:

    Guava 和 Apache Commons 都使用底层的 HashMap&lt;Class&lt;?&gt;, Class&lt;?&gt;&gt;,这并不是必需的,但可以提供可读的代码。

    以下 über 优化的 sn-p 在恒定时间内执行相同的功能,因为它通过索引查找映射到 Wrapper 类:

    private static final Class[] wrappers = {
            Integer.class,
            Double.class,
            Byte.class,
            Boolean.class,
            Character.class,
            Void.class,
            Short.class,
            Float.class,
            Long.class
    };
    
    @SuppressWarnings("unchecked")
    public static <T> Class<T> wrap(final Class<T> clazz) {
        if (!clazz.isPrimitive()) return clazz;
        final String name = clazz.getName();
        final int c0 = name.charAt(0);
        final int c2 = name.charAt(2);
        final int mapper = (c0 + c0 + c0 + 5) & (118 - c2);
        return (Class<T>) wrappers[mapper];
    }
    

    这涉及到一些代码高尔夫,所以除非你知道自己在做什么,否则不要重新排序类;)

    【讨论】:

    • 你能解释一下算法工作原理的本质吗?
    • 它使用实际类名的两个字母来执行非常受限的索引查找。相同的算法也适用于将包装器转换为原语,唯一的区别是您需要查找字母 10 和 12(java.lang. 前缀)。这里还有一些代码以及单元测试:github.com/melezov/runtime-bytegen/blob/master/src/main/java/…
    【解决方案3】:

    或者,如果您使用的是Guava,它有Primitives class,您可以这样使用:

    Primitives.wrap(int.class); //returns Class<Integer>
    Primitives.wrap(Integer.class); //returns Class<Integer>
    

    【讨论】:

      【解决方案4】:

      希望我理解正确。基本上你想要一个从原始类类型到它们的包装方法的映射。

      在某个 Utility 类中实现的静态实用程序方法将是一个优雅的解决方案,因为您可以像这样使用转换:

      Class<?> wrapper = convertToWrapper(int.class);
      

      或者,声明并填充静态地图:

      public final static Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>>();
      static {
          map.put(boolean.class, Boolean.class);
          map.put(byte.class, Byte.class);
          map.put(short.class, Short.class);
          map.put(char.class, Character.class);
          map.put(int.class, Integer.class);
          map.put(long.class, Long.class);
          map.put(float.class, Float.class);
          map.put(double.class, Double.class);
      }
      
      private Class<?> clazz = map.get(int.class);  // usage
      

      【讨论】:

      • 是的,这就是我最终的做法。谢谢你。
      • 你忘记了 void.class。只是说'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多