真的很难理解你在问什么,但我认为你在问 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[]
) 的转换也是合法的。
所以这意味着instanceof
和getClass()
测试将对原始数组类型给出相同的答案,但不是对所有数组类型。
事实上,在最初的 Java 语言设计中允许在不同数组类型之间进行任何转换可以说是一个错误。这会导致如下异常:
Object[] a = new String[1];
a[0] = new Object(); // throws ArrayStoreException !!!