31

我有这样的方法:

public static <T> boolean isMemberOf(T item, T[] set)
{
    for (T t : set) {
        if (t.equals(item)) {
            return true;
        }
    }
    return false;
}

现在我尝试使用charfor调用此方法T

char ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, chars);

这行不通。我希望charandchar[]自动装箱到Characterand Character[],但这似乎没有发生。

有什么见解吗?

4

10 回答 10

46

数组没有自动装箱,只有基元。我相信这是你的问题。

于 2009-02-05T20:28:18.913 回答
13

为什么会char[]被装箱到Character[]?数组始终是引用类型,因此不需要装箱。

此外,这将是非常昂贵的——它将涉及创建一个新数组,然后依次装箱每个字符。哎呀!

于 2009-02-05T20:30:07.503 回答
3

您可以使用反射来获得适用于所有类型数组的方法,但是您会失去类型安全性,因此这可能不是您想要的。

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;
}
于 2009-05-02T22:57:19.420 回答
2

正确,数组没有自动装箱(这会导致奇怪的情况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;
}

当然,每种原始类型都需要不同的版本。

于 2009-02-13T08:19:01.453 回答
1

这似乎是设计使然,既是为了避免如此昂贵的自动装箱操作,又是因为泛型必须向后兼容现有的 Java 字节码。

例如,请参阅这篇文章这个错误

于 2009-02-05T20:33:52.957 回答
1

数组是一种低级实现类型的东西。char[]将是具有两字节字符的连续内存区域。Character[]将是具有四个或八字节引用的连续内存区域。你不能用 aCharacter[]来包装一个 char[]。但是 aList<Character>可以包装 a char[]

除非您正在编写低级代码,否则引用数组通常不是一个好主意。如果您愿意,您可以编写或获得等效的java.util.Arrays.asList.

于 2009-02-05T20:34:42.830 回答
1

正如其他人所提到的,基元数组没有自动装箱。如果要将方法与原始数组一起使用,则需要为每个原始类型提供重载。这似乎是类库中做事的标准方式。例如,参见java.util.Arrays 中的重载。

于 2009-08-02T07:54:40.823 回答
1

首先,我会尽量避免使用数组,而是使用列表。

数组没有自动装箱,但可变参数有自动装箱。因此,如果您将方法声明为(具有相同的主体):

public static <T> boolean isMemberOf(T item, T ... set)

然后你可以写

isMemberOf('a', 'a', 'b', 'c');

就个人而言,我更喜欢使用 google 的 guava,你可以在其中编写类似的东西

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')
于 2012-11-14T10:21:12.217 回答
1

输入 Java 8 并让primArray成为 type 的标识符PrimType[],然后您可以执行以下操作:
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);

于 2016-04-01T17:50:52.627 回答
0

一个更简单的方法是

char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;
于 2009-02-05T22:56:59.313 回答