1

这有点像问:有什么是原始类型的子类/超类吗?

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

例如,在 Java中int[],它只是真的吗? ((Object) (new int[3])) instanceof int[]

如果是这样,

((Object) (new int[3])) instanceof int[]

等同于

((Object) (new int[3])).getClass() == int[].class

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

4

3 回答 3

5

真的很难理解你在问什么,但我认为你在问 usinggetClass()是否比使用instanceof数组类型更好。

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

   Object obj = new int[3];

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

   if (foo.getClass() == int[].class) {
       int[] array = (int[]) obj;
   }

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

从性能的角度来看,我看不出为什么这两个版本不能相同。在这种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 !!!
于 2013-08-09T01:31:51.227 回答
1

(A instanceof B) 当 A “isa” B 时返回 true,或者当您可以在预期 B 的地方使用 A 时返回 true。
使用 == 对类对象或类名的任何比较都将比较身份。如果你需要知道 A 和 B 是完全相同的类型,你可以使用 A.getClass() == B.getClass()。原始类型不从 Object 继承,但数组可以。例如,你可以说

if(new int[2] instanceof Object)

但不是

if(new int[2] instanceof Object[])

后者不会编译。

在面向对象编程中,您通常关心等价而不是精确类型。我认为您几乎总是想测试适用性(使用 instanceof)而不是身份(使用 ==)。
请注意,不需要强制转换为 Object。

if(new String[2] instanceof Object[])
    System.out.println("true");
于 2013-08-09T01:43:27.690 回答
0

Java 不是纯 OO 编程语言,因为存在原始数据类型。

问:有没有什么是原始类型的子类/超类?

A: 不,primitive 没有超类的子类,它只是原始类型。

Java中的数组是对象类型,无论它的内容是原始类型的对象类型,所以下面的说法是正确的:

 System.out.println("Is int[] instance of Object:"+(intArray instanceof Object));       
 System.out.println("The type of int[] is:"+(intArray instanceof int[]));
 System.out.println("Is the class of intArray equal to int[]:"+  
           (intArray.getClass()==int[].class));

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

答:不,没有证据证明这一点。即使是真的,这在 Java 中也不是问题,因为效率并不总是我们考虑的因素

于 2013-08-09T02:07:50.413 回答