【问题标题】:Why we need isPrimitive() in the first place?为什么我们首先需要 isPrimitive() ?
【发布时间】:2019-08-19 04:12:51
【问题描述】:

很抱歉这个不清楚的问题,但我真的迷失了为什么我们首先需要isPrimitive(),因为我无法使用它(对不起,我只是在需要的时候无法使用它;(这里是悲伤的脸)。

在这里和那里阅读帖子后,我发现了一些用法

int.class.isPrimitive()

但是我想要一些东西

boolean isTrue = true;
System.out.println(isTrue.class.isPrimitive());
System.out.println(Boolean.valueOf(isTrue).getClass().isPrimitive());

我试图在遍历对象的字段时检查类型;我现在能做的就是

private static boolean isPrimitiveWrapper(Object obj) {
    return obj.getClass() == Boolean.class ||
            obj.getClass() == Byte.class ||
            obj.getClass() == Character.class ||
            obj.getClass() == Short.class ||
            obj.getClass() == Integer.class ||
            obj.getClass() == Long.class ||
            obj.getClass() == Float.class ||
            obj.getClass() == Double.class;
}

但是看了一圈,我觉得应该有问题,但我不知道是什么问题。

任何用例都将不胜感激;)

我尽量不要太偏执...已经很努力了

【问题讨论】:

  • 在使用反射api时可能有用
  • 我现在实际上正在使用反射来进行遍历,但它的使用似乎过于严格,我对此感到很困惑。
  • 目前还不清楚您要实现什么。您正在使用 object 的类,它永远不会是原始类型 - 但如果您要使用 字段的类型,它很容易成为原始类型。
  • 我正在尝试使用反射来遍历一个类中的所有字段,只要它是一个可打印的值(私有字段和继承的所有字段甚至包括超父类对象),我都会打印出来。对象详细信息转储器/打印机的种类。
  • 这解释了为什么该方法存在。当你使用它时会发生什么?为什么你不能使用它? Class#isPrimative() 编辑:答案已经是所有这些帖子的答案。您必须结合包装检查、常规检查和字符串检查。

标签: java java-8 primitive-types


【解决方案1】:

由于原始类型在某些情况下不能作为对象处理,例如数组, 作为第一个鉴别器很好。

Object cloneObject(Object obj) {
    Class<?> type = obj == null ? Object.class : obj.getClass();
    if (type.isArray()) {
        Class<?> elemType = type.getComponentType();
        if (!elemType.isPrimitive()) {
            Object[] copy = ...
        } else {
            // Must distinguish between int/double/boolean/...
            ... int[] ... double[] ...
        }
    }

Object inta = new int[] { 2, 3, 5, 7 };
int[] pr = (int[]) cloneObject(inta);

【讨论】:

  • 看起来很棒! Upvoted ;) 我刚刚遇到它。还有其他可能的情况吗?
  • 实际上,反射 API 中缺少的是获取原始类的包装器 Object 类,有点像上面的内容。或者用于您自己的字节序列化。
  • @JoopEggen 在this Q&A 上提醒我,例如MethodHandles.zero(primitiveType).invoke().getClass() 可以。但是,当然,这不是人们能想象到的最简单的 API……
  • @Holger 确实更好的示例代码。我们将看到在下一个 java 中会变成什么样的原始类型,List&lt;int&gt; 等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2019-06-09
  • 2014-06-18
  • 2017-02-26
  • 2011-04-03
  • 2017-07-27
  • 2020-09-21
相关资源
最近更新 更多