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的实例