web-dev-qa-db-ja.com

「..の汎用配列を作成できません」-Map <String、Object>の配列を作成する方法は?

SimpleJdbcInsertクラスとexecuteBatchメソッドを使用したい

public int[] executeBatch(Map<String,Object>[] batch)

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/simple/SimpleJdbcInsert.html

したがって、Map<String,Object>の配列をパラメーターとして渡す必要があります。そのような配列を作成する方法は?私が試したのは

Map<String, Object>[] myArray = new HashMap<String, Object>[10]

エラーです:Map<String, Object>の汎用配列を作成できません

List<Map<String, Object>>の方が簡単ですが、配列が必要だと思います。 Map<String, Object>の配列を作成する方法は?ありがとう

33
user2079650

Javaのジェネリックがどのように機能するかにより、ジェネリック型(_Map<String, Object>[]_など)の配列を直接作成することはできません。代わりに、ロー型(_Map[]_)そして、それを_Map<String, Object>[]_にキャストします。これにより、避けられない(ただし抑制可能な)コンパイラー警告が発生します。

これはあなたが必要とするもののために働くはずです:

_Map<String, Object>[] myArray = (Map<String, Object>[]) new Map[10];
_

警告が表示されないようにするために、@SupressWarnings("unchecked")でこのメソッドに注釈を付けることができます。

58
Jonathan Callen

マップの汎用配列を作成できます。

  1. マップのリストを作成します。

    List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>();
    
  2. 配列を初期化します。

    Map<String,?>[] myDataArray = new HashMap[myData.size()];
    
  3. リストから配列にデータを入力します。

    myDataArray = myData.toArray(myDataArray);
    
1
Ruju

これには多少の困難がありましたが、できる限り簡単に共有できるいくつかの点を見つけました。

ジェネリックに関する私の経験はコレクションに限定されているため、次のようなクラス定義で使用します。

public class CircularArray<E> {

データメンバーを含む:

private E[] data;

ただし、ジェネリック型の配列を作成することはできないため、メソッドがあります。

@SuppressWarnings("unchecked")
private E[] newArray(int size)
{
    return (E[]) new Object[size];  //Create an array of Objects then cast it as E[]
}

コンストラクター内:

data = newArray(INITIAL_CAPACITY);  //Done for reusability

これはジェネリックジェネリックに対しては機能しますが、ソート可能なリスト、Comparablesのリストが必要でした。

public class SortedCircularArray<E extends Comparable<E>> { 
//any E that implements Comparable or extends a Comparable class

データメンバーを含む:

private E[] data;

しかし、新しいクラスはJava.lang.ClassCastExceptionをスローします。

@SuppressWarnings("unchecked")
private E[] newArray(int size)
{
    //Old: return (E[]) new Object[size];  //Create an array of Objects then cast it as E[]
    return (E[]) new Comparable[size];  //A comparable is an object, but the converse may not be
}

コンストラクターではすべてが同じです:

data = newArray(INITIAL_CAPACITY);  //Done for reusability

これがお役に立てば幸いです。間違いを犯した場合は、経験豊富なユーザーが私を修正してくれることを願っています。

0
Mikeologist

私の知る限り

最初にJava.lang.Objectの配列を作成してから、ジェネリック型Tにキャストします

例:

class Example<DataType>{
    public DataType array = (DataType[]) new Object[5] ; 
}

このようにして、汎用データ型の配列を作成できます

0
Mr. Suryaa Jha

Oracleチュートリアル [sic]から:

パラメーター化された型の配列を作成することはできません。たとえば、次のコードはコンパイルされません。

List<Integer>[] arrayOfLists = new List<Integer>[2];  // compile-time error

次のコードは、さまざまな型が配列に挿入されたときに何が起こるかを示しています。

Object[] strings = new String[2];
strings[0] = "hi";   // OK
strings[1] = 100;    // An ArrayStoreException is thrown.

一般的なリストで同じことをしようとすると、問題が発生します。

Object[] stringLists = new List<String>[];  // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>();   // OK
stringLists[1] = new ArrayList<Integer>();  // An ArrayStoreException should be thrown,
                                            // but the runtime can't detect it.

パラメータ化されたリストの配列が許可されている場合、以前のコードは必要なArrayStoreExceptionのスローに失敗します。

私には、非常に弱いようです。ジェネリックを十分に理解しているプログラマであれば、問題なくArrayStoredExceptionがスローされることはないと思います。

さらに、ほとんどのプログラマーは単に次のことを行います。

List<Integer> arrayOfLists = (List<Integer>) new List[2];

arrayStoreExceptionがスローされないのとまったく同じリスクになります。

0
Stick Hero