31

私はこのような方法を持っています:

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

charここで、 forを使用してこのメ​​ソッドを呼び出そうとしますT:

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

これはうまくいきません。charandがandchar[]に自動ボックス化されることを期待していますが、それは起こらないようです。CharacterCharacter[]

洞察はありますか?

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[]2バイト文字のメモリの連続領域になります。Character[]4バイトまたは8バイトの参照を持つメモリの連続した領域になります。Character[]char[]をラップするaを取得することはできません。ただし、List<Character>はをラップできchar[]ます。

低レベルのコードを記述していない限り、参照の配列は通常はお勧めできません。必要に応じて、に相当するものを記述または取得できますjava.util.Arrays.asList

于 2009-02-05T20:34:42.830 に答える
1

As others have mentioned, there is no autoboxing for arrays of primitives. If you want to use your method with primitive arrays, you will need to provide an overload for each primitive type. This seems to be the standard way of doing things in the class libraries. See the overloads in java.util.Arrays, for example.

于 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 に答える