43

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>

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

4

6 に答える 6

72

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

これは、必要なものに対して機能するはずです。

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

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

于 2013-02-17T02:56:51.363 に答える
0

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 がスローされないというまったく同じリスクが発生します。

于 2016-09-29T10:25:24.057 に答える
0

これにはいくつかの困難がありましたが、できるだけ簡単に共有するいくつかのことを考え出しました.

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

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

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

于 2014-04-17T17:39:39.570 に答える