17

ジェネリック クラスが配列、またはプリミティブ配列でなければならないことを指定しようとしています。これまでのところ、これは私が取り組んでいるものです:

interface Foo<T> {
  void process( T data );
}

public class Moo implements Foo<int[]> {
  void process( int[] data ) {
     // do stuff here
  }
}

これはすべて完全に有効な Java コードであり、プリミティブ配列が Object を拡張するため機能します。この質問は、私が見つけ続けている他のすべてのJava配列の一般的な質問とは完全に異なることに注意してください。そのような状況では、人々はジェネリック型から配列を作成したいと考えています。

問題は、型 T が Object を拡張するものであれば何でもよいということです。私がしたいのは、次のようなことです:

<T extends ONLY ARRAYS>

また

<T extends ONLY PRIMITIVE ARRAYS>.

それは可能ですか?

編集:最終的な目標は、渡される配列型にコンパイル時のチェックを追加することです。現在、古いオブジェクトを渡すことができ、問題なくコンパイルされます。間違いは、実行時にクラス キャスト例外がスローされたときにのみ検出されます。実際、これが Java の Generics の要点であり、コンパイル時の型チェックを強化することです。

4

4 に答える 4

10

これはできません。配列を拡張できるクラスはないため、ジェネリック パラメータを満たす型は存在しませんT extends Object[]。(それ自体以外Object[]ですが、ジェネリックを使用することはありません。)

あなたができることは次のようなものです:

public interface Foo<T extends Number> {
    public void process(T[] data);
}

ただし、ボクシングでパフォーマンスの問題が発生する可能性があります。

于 2012-05-02T23:50:15.303 に答える
8

Java では、型パラメーターはサブタイプの関係によってのみ制約でき、すべての配列の唯一の共通のスーパータイプ Objectとです。あなたが得ることができる最も近いものは、非プリミティブなコンポーネント型を持つすべての配列のスーパータイプであるに制約することです。ClonableSerializableObject[]Number[]Integer[]Long[]

Java がそのような制約をサポートしていたとしても、その配列で何か役に立つことはありますか? 結果を保持する変数を宣言できないため、個々の要素を読み取ることも、配列要素に割り当て可能な式を書き留めることができないため、個々の要素を書き込むこともできませんでした。

つまり、型変数を配列型ではなくコンポーネント型にバインドします。

interface Foo<T extends Whatever> {
    void process(T[] data );
}

を知っていることを参照することはできますが、 a を知ってT[]いてもコンポーネントの型を直接参照することはできません。TT extends Object[]

編集: Jeffrey は、配列型を型境界で使用できない、つまりコンパイルしないことを正しく指摘しているため、配列型を参照するために宣言して使用するという<T extends Whatever[]>私のアドバイスに従う必要があります。<T extends Whatever>T[]

于 2012-05-03T00:30:51.277 に答える
1

できません。「興味深い」インターフェイスもスーパータイプもありませんが、プリミティブの配列には Object が存在します。

public class SOTEST {    
    public static void main(String[] args) throws Exception {
        int[] arr = new int[] {};
        Class c = arr.getClass();
        for(Class clazz:c.getInterfaces()) {
            System.out.println(clazz.getName());
        }

        System.out.println(c.getSuperclass().toString());
    }
}
于 2012-05-02T23:58:06.940 に答える
-3

X の配列には型階層がありません。Integer[] は Number[] のサブクラスではありません。

必要なものを取得するには、配列コンポーネントの型を型パラメーター T として使用し、パラメーターと戻り値の型を T の配列として宣言します。

于 2012-05-04T02:48:33.477 に答える