2011-07-15 11 views
0

私はjavaファイルを書くツールを開発中です。ある時点では配列宣言を書く必要があります。 、しかし、私は配列のすべての種類のための単一および一般的な方法をしたいと思い、事は、私はジェネリックでタイプを処理する方法がわからないということである。すなわち配列宣言文字列を書く

public static String arrayToCode(Long[] arr, String arrName) { 
    StringBuilder sb = new StringBuilder(); 

    sb.append("Long[]" + arrName + " = { "); 
    for (int i = 0; i < arr.length; i++) { 
     sb.append(arr[i] + "L, "); 
    } 
    sb.append("};"); 

    return sb.toString(); 
    } 

    public static String arrayToCode(String[] arr, String arrName) { 
    StringBuilder sb = new StringBuilder(); 

    sb.append("String[]" + arrName + " = { "); 
    for (int i = 0; i < arr.length; i++) { 
     sb.append(arr[i] + "L, "); 
    } 
    sb.append("};"); 

    return sb.toString(); 
    } 

    public static String arrayToCode(Double[] arr, String arrName) { 
    StringBuilder sb = new StringBuilder(); 

    sb.append("Double[]" + arrName + " = { "); 
    for (int i = 0; i < arr.length; i++) { 
     sb.append(arr[i] + "L, "); 
    } 
    sb.append("};"); 

    return sb.toString(); 
    } 

:私は、次のメソッドを実装していますLongString、またはDoubleの配列はどのようにわかりますか?

+0

はなぜ引数(文字列など)実際の配列インスタンスの代わりの種類の名前だけの一つですか?ああ、BTW、配列とJavaのジェネリックスはまったく混ざり合っていません。 –

+0

これはどういう意味ですか? '+" L "、'(sb.append(arr [i] + "L");}ループ内) –

+0

これは整数をLongに変換するものです。しかし、他のタイプの問題です。それをキャッチするためにありがとう。 –

答えて

1

Object[]を受け入れてから、getClass()を使用して実際のタイプを把握することができます。あなたは本当にあなたがgetName()して上記getSimpleName()を置き換えることができ、その場合、あなたはおそらく、完全修飾名を使用する必要があるコードを生成しようとしている場合はgetArrayType()

public static String arrayToCode(Object[] arr, String arrName) { 
    String arrayTypeText = getArrayType(arr); 
    sb.append(arrayTypeText + " " + arrName + ...); 
    //... 
} 


private String getArrayType(Object[] arr) { 
    Class<?> clazz = arr.getClass(); 
    if (clazz == Double[].class) { 
     return "Double[]"; 
    } else if (...) { 
    } 
} 

代替実装は

private String getArrayType(Object[] arr) { 
    return arr.getClass().getComponentType().getSimpleName() + "[]"; 
} 

かもしれません(java.lang.Longを返します)

+0

具体的には、getClass()。getComponentType() –

+0

@Ed Staub:ありがとうございました。 –

+0

私はこれと一緒に行きました。ここまでは順調ですね。ありがとう –

6
public static String arrayToCode(Object[] arr, String arrName) { 
    StringBuilder sb = new StringBuilder(); 

    sb.append(arr.getClass().getComponentType() + "[]" + arrName + " = { "); 
    for (int i = 0; i < arr.length; i++) { 
     sb.append(arr[i] + "L, "); 
    } 
    sb.append("};"); 

    return sb.toString(); 
} 
+0

うん、私の投稿が正確にこれを言っていないのは見えませんが、この場合は 'toString'として必要な' getName'を使用するという私の言及は 'getName()'だけを返しません。 –

1

Class-getにはいくつかのオブジェクトがあります名前()、getCanonicalName()。違いがわからない

public class CodeGen { 

    public static String arrayToCode(Object[] arr, String arrName) { 
     StringBuilder sb = new StringBuilder(); 

     sb.append(arr.getClass().getCanonicalName()+" " + arrName + " = { "); 
     for (int i = 0; i < arr.length; i++) { 
      sb.append(arr[i] + "L, "); 
     } 
     sb.append("};"); 

     return sb.toString(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String[] foo = new String[] { "a","b","c" }; 
     System.out.println(arrayToCode(foo, "foobar")); 
    } 

} 
1

これを試してみてください:

public class Foo 
{ 
    public static void main(String [] args) 
    { 
    System.out.println(
    arrayToList(new Integer[] {1, 2 ,3}, "Foo") 
    ); 
    } 

    public static <T> String arrayToList (T[] data, String name) 
    { 
    StringBuilder sb = new StringBuilder(); 

    sb.append(data[0].getClass().getSimpleName() + "[]" + name + " = { "); 
    for (int i = 0; i < data.length; i++) 
    { 
     sb.append(data[i] + "L, "); 
    } 
    sb.append("};"); 

    return sb.toString(); 
    } 
} 
+0

arrayToList(新しい整数[] {}、 "Foo"); IndexOutOfBoundsExceptionをスローします。おっとっと! – George

関連する問題