Java 将instanceof与基元类型数组一起使用没有意义吗?

Java 将instanceof与基元类型数组一起使用没有意义吗?,java,class,object,instanceof,primitive-types,Java,Class,Object,Instanceof,Primitive Types,这与问:是否有任何东西可以对基元类型进行子类化/超类化? (因为((对象)(新字符串[6])对象[]的实例为true,因为字符串扩展了对象) 例如,对于int[],在Java中是否只有((对象)(新的int[3])int[]的实例是真的 如果是, ((Object) (new int[3])) instanceof int[] 与相同 ((Object) (new int[3])).getClass() == int[].class 我更喜欢后一种,因为它应该更快,因为它不必检查每个类型/类

这与问:是否有任何东西可以对基元类型进行子类化/超类化?

(因为
((对象)(新字符串[6])对象[]
的实例为true,因为
字符串扩展了对象

例如,对于
int[]
,在Java中是否只有
((对象)(新的int[3])int[]
的实例是真的

如果是,

((Object) (new int[3])) instanceof int[]
与相同

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

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

很难理解您的要求,但我想您是在问,对于数组类型,使用
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;
   }
显然,第一种形式更具可读性

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

要确定哪一个速度更快,唯一的办法是编写一个像样的微基准,并在您感兴趣的平台上运行它。请注意,对于不同版本的Java,您可能会得到不同的性能结果

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


这在某种程度上与问:是否有任何东西可以将基元类型子类/超类化

不,这根本不等于问这个问题。Java数组类型不是基元类型。它们是引用类型

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

答案取决于基本类型;看见如果基类型是(不同的)基元类型,则答案是否。如果基类型是引用类型,则如果可以从一个基类型(
BC1
)转换到另一个基类型(
BC2
),则涉及数组类型(
BC1[]
BC2[]
)的转换也是合法的

因此这意味着
instanceof
getClass()
测试将为基元类型的数组给出相同的答案,但不是所有数组类型


事实上,在最初的Java语言设计中允许在不同数组类型之间进行任何转换,这可能是一个错误。这会导致以下异常情况:

    Object[] a = new String[1];
    a[0] = new Object();  // throws ArrayStoreException !!!

很难理解您的要求,但我想您是在问对于数组类型使用
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;
   }
显然,第一种形式更具可读性

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

要确定哪一个速度更快,唯一的办法是编写一个像样的微基准,并在您感兴趣的平台上运行它。请注意,对于不同版本的Java,您可能会得到不同的性能结果

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


这在某种程度上与问:是否有任何东西可以将基元类型子类/超类化

不,这根本不等于问这个问题。Java数组类型不是基元类型。它们是引用类型

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

答案取决于基本类型;看见如果基类型是(不同的)基元类型,则答案是否。如果基类型是引用类型,则如果可以从一个基类型(
BC1
)转换到另一个基类型(
BC2
),则涉及数组类型(
BC1[]
BC2[]
)的转换也是合法的

因此这意味着
instanceof
getClass()
测试将为基元类型的数组给出相同的答案,但不是所有数组类型


事实上,在最初的Java语言设计中允许在不同数组类型之间进行任何转换,这可能是一个错误。这会导致以下异常情况:

    Object[] a = new String[1];
    a[0] = new Object();  // throws ArrayStoreException !!!
(A instanceof B)当A“isa”B时返回true,或者当您可以在预期A B的位置使用A时返回true。
使用==对类对象或类名进行的任何比较都将比较标识。如果需要知道A和B是完全相同的类型,可以使用A.getClass()==B.getClass()。 基元类型不从对象继承,但数组继承。例如,你可以说

if(new int[2] instanceof Object)
但不是

if(new int[2] instanceof Object[])
后者不会编译。

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

if(new String[2] instanceof Object[])
    System.out.println("true");
(A)B)ret的实例