2017-06-01 38 views
0

異なるデータ型に対して同じ関数を再利用することはできますか? 私はバイトのArrayListに私はこの複数のデータ型に同じ関数を使用する

public static byte[] arrayListToByteArray(ArrayList<Byte> list) { 
    byte[] out = new byte[list.size()]; 
    int count = 0; 
    for (byte x : list) { 
     out[count] = x; 
     count++; 
    } 
    return out; 
} 

をしなければならないことをやりたいのであれば、たとえば、私は整数配列

public static int[] arrayListToIntArray(ArrayList<Integer> list) { 
    int[] out = new int[list.size()]; 
    int count = 0; 
    for (int x : list) { 
     out[count] = x; 
     count++; 
    } 
    return out; 
} 

にInteger型のArrayListを変換する関数を持っているしかし、私は同じコードを異なるデータ型で繰り返し、基本的に同じコードのクラス全体を持つよりも良い方法があるのだろうかと思います。それとも、すべてのデータ型に使用できるようにすることができますか?

+1

されていない場合ラッパーからプリミティブ型を戻したいとします。 –

+0

これは、私がその関数に特有ではなく、とにかく感謝している例です。 – Nightfortress

+0

一般的に、パフォーマンスとJava-yの理由から、プリミティブ型ではこれをやりたくはありません。 Javaをプリミティブ/配列ベースのものとObject/Genericsベースのものに分割するのが最善です。これをNumber.classを使用して回避することができますが、ストリームや関数などのプリミティブなバージョンが存在する理由があります。あなたがC#から来ているなら、これは大きな違いです。 – Novaterata

答えて

3

はいできます。それはGenericsと呼ばれています。

public static <T> T[] arrayListToIntArray(ArrayList<T> list) { 
    T[] out = (T[]) new Object[list.size()]; 
    int count = 0; 
    for (T x : list) { 
     out[count] = x; 
     count++; 
    } 
    return out; 
} 

アップデート:あなたもthisを見て、型になります別の引数を渡すことができるように

あなたはジェネリック型をインスタンス化することはできません。

public static <T> T[] arrayListToIntArray(ArrayList<T> list, Class<T> t) { 
     T[] out = (T[]) Array.newInstance(t, list.size()); 
     int count = 0; 
     for (T x : list) { 
      out[count] = x; 
      count++; 
     } 
     return out; 
    } 
+0

そのコードで「タイプの不正な開始」エラーが発生する理由を説明できますか? – Nightfortress

+0

私は答えを更新しました。見てみよう。 – epinal

+0

問題は解決しましたか?回答があった場合は解決策としてマークしてください。質問がある場合はお知らせください。ありがとう@Nightfortress – epinal

1

ジェネリック医薬品へのあなたの方法でタイピングを変更するには、この

public static <T> T[] arrayListToArray(ArrayList<T> list, Class<T> type) { 
    @SuppressWarnings("unchecked") 
    final T[] out = (T[]) Array.newInstance(type, list.size()); 
    int count = 0; 
    for (T x : list) { 
     out[count] = x; 
     count++; 
    } 
    return out; 
} 

を書き、その後、この

public static void main(String[] args) { 
    ArrayList<Integer> intList = new ArrayList<>(); 
    intList.add(13); 
    intList.add(37); 
    intList.add(42); 
    Integer[] intArray = arrayListToArray(intList, Integer.class); 

    ArrayList<Byte> byteList = new ArrayList<>(); 
    byteList.add((byte) 0xff); 
    byteList.add((byte) 'y'); 
    byteList.add((byte) 17); 
    Byte[] byteArray = arrayListToArray(byteList, Byte.class); 

    System.out.println(Arrays.toString(intArray)); 
    System.out.println(Arrays.toString(byteArray)); 
} 

出力のようにそれを使用することができます:

[13, 37, 42] 
[-1, 121, 17] 
関連する問題