Java:阵列的基本数据类型不autobox
-
21-08-2019 - |
题
我有一个方法是这样的:
public static <T> boolean isMemberOf(T item, T[] set)
{
for (T t : set) {
if (t.equals(item)) {
return true;
}
}
return false;
}
现在我尝试打电话这种方法的使用 char
对于 T
:
char ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, chars);
这不起作用。我期望的 char
和 char[]
获得autoboxed到 Character
和 Character[]
, 但这似乎并没有发生。
任何见解?
解决方案
有对于阵列没有自动装箱,只为原语。我相信这是你的问题。
其他提示
为什么会char[]
装箱到Character[]
?阵列总是引用类型,因此不需要拳击。
此外,这将是昂贵的可怕 - 这将涉及创建一个新的数组,然后拳击依次在每个炭。糟糕!
您可以使用反射来获取,对于所有类型的数组奏效的方法,但你会失去类型安全,所以这可能不是你想要的。
import java.lang.reflect.Array
public static boolean isMemberOfArray(Object item, Object array)
{
int n = Array.getLength(array)
for (int i = 0; i < n; i++) {
if (Array.get(array, i).equals(item)) {
return true;
}
}
return false;
}
正确,没有自动装箱为阵列(其导致在古怪像int[] ints; ...; Arrays.asList(ints)
箱子! - asList返回包含一个单一的对象,所述阵列的列表)
下面是一个简单的工具到框阵列。
public static Integer[] boxedArray(int[] array) {
Integer[] result = new Integer[array.length];
for (int i = 0; i < array.length; i++)
result[i] = array[i];
return result;
}
您将需要不同的版本为每个原语类型,当然。
阵列是一个低级别的实现类型的东西。 char[]
将是存储器具有两字节字符的连续区域。 Character[]
将是一个连续的内存区域具有四个或八字节的引用。你不能得到一个Character[]
来包装一个char []。然而一个List<Character>
可以换一个char[]
。
引用数组通常不,除非你正在写底层代码是个好主意。你可以,如果你愿意的话,写或获得java.util.Arrays.asList
的等效。
正如其他人提及的,存在一种用于基元的阵列没有自动装箱。如果你想用原始的阵列使用你的方法,你需要为每个原始类型的过载。这似乎是在类库做事的标准方法。参见 java.util.Arrays中一个重载>,例如
首先,我会尽量避免阵列尽可能多的,你可以使用列表来代替。
没有自动装箱数组,但有自动装箱为可变参数。所以,如果你申报你的方法(与同体):
public static <T> boolean isMemberOf(T item, T ... set)
然后可以写
isMemberOf('a', 'a', 'b', 'c');
就个人而言,我更喜欢使用谷歌的番石榴,在那里你可以写的东西像
char ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, Chars.asList(chars).toArray(new Character[0]));
您的代码很可能只是一个例子,但如果你真的想考的成员,你可以做这样的:
Chars.contains(chars, ch);
or
ImmutableSet.of('a', 'b', 'c').contains('a')
输入的Java 8和让primArray
是类型PrimType[]
的标识符,则可以的执行下列操作:搜索
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);
一个更简单的方法来做到这一点是
char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;