0

このためのジェネリックメソッドを正しく記述できません。

private int [] loadIntArray(String key, int [] defaultArray) {
    int [] array = new int [4];
    for( int index=0; index<4 ; index++) {
        array[index] = sp.getInt(key + index, defaultArray[index]);
    }
    return array;
}

私はこれを書いた:

private <T[]> loadArray(String key, <T[]> defaultArray) {
    <T[]> array = new <T[LEVELS]>;
    for( int index=0; index<4 ; index++) {
        array[index] = sp.getInt(key + index, defaultArray[index]);
    }
    return array;
}

しかし、それはコンパイルされません。
「メソッドの戻り型がありません」、「プライベートトークンの後に型が必要です」というエラーがいくつか発生します。

それを書く正しい方法は何でしょうか?

4

5 に答える 5

3

class parameterそれを達成するには、メソッドに a を追加する必要があります

Class<T> type

あなたのメソッドは次のようになります

 private <T> T[] loadArray(Class<T> type, String key, T[] defaultArray) {
      T[] array = (T[]) Array.newInstance(type, defaultArray.length);
      for (int index = 0; index < array.length; index++) {
         array[index] = sp.getInt(key + index, defaultArray[index]);
      }
      return array;
   }

質問の後に更新:
このメソッドの呼び出しはどのようになりますか? (たとえば、タイプ「int」の場合)?

Pair オブジェクトを作成する場合、型パラメーター K または V をプリミティブ型に置き換えることはできません。

Pair<int, char> p = new Pair<>(8, 'a'); // コンパイル時エラー 型パラメーター K および V を非プリミティブ型のみに置き換えることができます。

Pair<Integer, Character> p = new Pair<>(8, 'a');

考えられる回避策
(一般的な方法で渡し、プリミティブ配列として保持する唯一の方法は、オブジェクトとして使用することです)。

Object a[]= {1,2,3};
loadArray(Object.class, "test", a);

または、非プリミティブ型 (Integer) を使用できます

Integer a[]= {1,2,3};
loadArray(Integer.class, "test", a);
于 2013-03-18T13:01:12.883 に答える
2

T特定の型ではなく、型の配列を返しますT[]

これはあなたが行きたい方向により多くなります。

private <T> T[] loadIntArray(String key, T[] defaultArray) {
    T[] array = new T[4]; // Need more info to correct this
    for (int index = 0; index < 4; index++) {
        array[index] = sp.getInt(key + index, defaultArray[index]);
    }
    return array;
}
于 2013-03-18T12:50:21.247 に答える
1

defaultArray常にnilコンポーネントタイプの配列であると仮定するとT、そのタイプを使用して新しい配列を作成できます。

import java.lang.reflect.Array;

private <T> T[] loadIntArray(String key, T[] defaultArray) {
    T[] array = (T[])Array.newInstance(defaultArray.getClass().getComponentType(), 4);
    for (int index = 0; index < 4; index++) {
        array[index] = sp.getInt(key + index, defaultArray[index]);
    }
    return array;
}

ただし、defaultArrayのランタイムタイプがのサブタイプの配列である場合T、これは機能しないことに注意してください。が発生しArrayStoreExceptionます。

于 2013-03-19T05:40:49.997 に答える
0

これがOP。
これは明確な答えではありませんが、見たい人のためにコンパイルする最終的なコードを投稿したかったのです。

他の回答で言及されていない重要なことの 1 つは、Java ジェネリックがプリミティブ型 (int、float、...) のみのオブジェクトをサポートしていないことです。そのため、代わりに配列を Integer と Float に変更する必要がありました。

private <T> void loadArray(final T[] array, final String key, final T[] defaultArray) {
    int count = array.length;
    for( int index = 0; index < count; index++ ) {
        //if( array[index] instanceof PointF ) {
        if( array instanceof PointF[] ) {
            PointF element = new PointF();
            element.x = sp.getFloat(key + index, (Float) defaultArray[index]);
            element.y = sp.getFloat(key + index, (Float) defaultArray[index]);
            array[index] = (T) element;
        //} else if( array[index] instanceof Float ) {
        } else if( array instanceof Float[] ) {
            Float element = sp.getFloat(key + index, (Float) defaultArray[index]);
            array[index] = (T) element;
        //} else if( array[index] instanceof Integer ) {
        } else if( array instanceof Integer[] ) {
            Integer element = sp.getInt(key + index, (Integer) defaultArray[index]);
            array[index] = (T) element;
        }
    }
}

編集
配列が次元化されているが初期化されていない場合、

array[index] instanceof Integer  

を返すfalseので、テストを次のように変更しました

arrray instanceof Integer[]  

true配列要素が であっても返されますnull

于 2013-03-18T16:48:41.813 に答える
0

まず、メソッド シグネチャは次のようになります。

private <T> T[] loadArray(String key, T[] defaultArray)
于 2013-03-18T12:52:40.347 に答える