我有一个方法是这样的:

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);

这不起作用。我期望的 charchar[] 获得autoboxed到 CharacterCharacter[], 但这似乎并没有发生。

任何见解?

有帮助吗?

解决方案

有对于阵列没有自动装箱,只为原语。我相信这是你的问题。

其他提示

为什么会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;
}

您将需要不同的版本为每个原语类型,当然。

这似乎是通过设计,既避免这样一种昂贵的自动装箱操作,并由于泛型必须是向后兼容,与现有的Java码。

看看 这篇文章这个错误, 例。

阵列是一个低级别的实现类型的东西。 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;
scroll top