是否有点使用instanceof与原始类型数组?

mid*_*ite 1 java class object instanceof primitive-types

这在某种程度上与询问相同:是否存在子类/超类基元类型的任何内容?

(因为((Object) (new String[6])) instanceof Object[]是真的,因为String extends Object.)

例如,的int[],是它唯一的 ((Object) (new int[3])) instanceof int[]是真实的,在Java中的东西?

如果是这样,

((Object) (new int[3])) instanceof int[]
Run Code Online (Sandbox Code Playgroud)

是完全相同的

((Object) (new int[3])).getClass() == int[].class
Run Code Online (Sandbox Code Playgroud)

而我更喜欢后者,因为它应该更快,因为它不必检查每个类型/类继承.

Ste*_*n C 5

很难理解你在问什么,但我想你在问是否使用getClass()比使用instanceof数组类型更好.

从可读性的角度来看,instanceof更好:

   Object obj = new int[3];

   if (obj instanceof int[]) {
       int[] array = (int[]) obj;
   }

   if (foo.getClass() == int[].class) {
       int[] array = (int[]) obj;
   }
Run Code Online (Sandbox Code Playgroud)

显然,第一种形式更具可读性.

从性能的角度来看,我不明白为什么这两个版本可能不相同.在这种instanceof情况下,int[]类型没有子类型,因此可以将其编译为与版本等效或甚至更快getClass()版本.

确定哪个实际上更快的唯一方法是编写一个不错的微基准测试并在您感兴趣的平台上运行它.请注意,您可能会针对不同版本的Java获得不同的性能结果

但是,我强烈怀疑性能差异太小而不能对您的应用程序产生任何影响.除非你已经有具体的分析结果指出这是一个瓶颈......你可能会浪费你的时间.


这在某种程度上与询问相同:是否存在子类/超类基元类型的任何内容?

不,这完全不等于要求.Java数组类型不是基本类型.它们是参考类型.

然而,它与数组类型之间是否存在子类型关系的问题有关.或者更准确一点,它归结为您是否可以从一种数组类型转换为另一种数组类型.

它的答案取决于基本类型; 见JLS 5.5.1.参考类型铸造.如果基类型是(不同的)基本类型,那么答案是否定的.如果基类型是引用类型,那么如果可以从一个基类型(BC1)转换为另一个(BC2),那么涉及数组类型(BC1[]to BC2[])的转换也是合法的.

因此,这意味着instanceofgetClass()测试将给予阵列的原始的类型相同的答案,但不是所有的数组类型.


实际上,在原始Java语言设计中允许在不同数组类型之间进行任何转换可能是一个错误.这会导致异常,例如:

    Object[] a = new String[1];
    a[0] = new Object();  // throws ArrayStoreException !!!
Run Code Online (Sandbox Code Playgroud)