2013-02-17 17 views
26

I simpleJdbcInsert sınıfı ve "Genel dizisi oluşturulamıyor .." - Bir Harita Dizisi nasıl oluşturulur? <String, Object>?

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

public int[] executeBatch(Map<String,Object>[] batch) 
yüzden parametre olarak Map<String,Object> bir dizi geçmesine gerek executeBatch yöntemi kullanmak istiyoruz. Böyle bir dizi nasıl oluşturulur? kolay olurdu Map<String, Object>

A List<Map<String, Object>> jenerik dizi oluşturulamıyor, ama bir dizi ihtiyacım tahmin: Ne denedim Bu hatadır

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

olduğunu. Peki, Map<String, Object> bir dizi nasıl oluşturulur? Teşekkürler

+0

Büyük olasılıkla bir Liste ile başlayıp [gerektiğinde bir diziye dönüştürün] (http://docs.oracle.com/javase/6/docs/api/java/util/List.html#toArray (T [])), Java dizileri ile uğraşmaktan hoşlanmıyorum ... ama yine de bu geçerli bir soru. –

+0

@pst: Bunu bir yanıt olarak gönderin. Genel dizileri yayınlamaktan nefret ediyorum (bir cevapta son denemem yanlıştı çünkü kırık jeneriklerin ne olduğunu unuttum). LinkedHashMap map_array [] = new LinkedHashMap [2] kullanırken – nneonneo

cevap

47

Java'daki jeneriklerin nasıl çalıştığı nedeniyle, genel bir türden bir dizi oluşturamazsınız (örneğin, Map<String, Object>[]). Bunun yerine, ham türden bir dizi (Map[]) oluşturun ve Map<String, Object>[]'a dönüştürün. Bu, kaçınılmaz (ancak bastırılabilir) bir derleyici uyarılmasına neden olur.

Bu gerekenler için çalışması gerekir:

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

Sen gösterilmesini uyarıyı önlemek için, @SupressWarnings("unchecked") ile bu meydana yöntemi içinde açıklama isteyebilir.

+0

; Ayrıca bu hatayı veriyor? Şimdi burada 'jenerik' ne anlamadım? – Diffy

+0

@Diffy "Genel" bölümü, 'tür parametrelerini içerir. Hatayı kaldırmak için (ve bir uyarı ile değiştirin), 'LinkedHashMap [] map_array = (LinkedHashMap ) new LinkedHashMap [2];' –

+0

kullanın. sadece yeni LinkedHashMap [2] kullanarak, ancak bir Object veri türü veya "T" (genel tmplate) kullanmış olsaydım, jenerik olurdu. Neden geneldir? Buradaki uygun veri tipini burada belirtiyorum – Diffy

1

Sen haritaların bir listesini oluşturun haritası

  1. jenerik dizi oluşturabilirsiniz.

    List<Map<String, ?>> myData = new ArrayList<Map<String, ?>>(); 
    
  2. Diziyi başlat.

    Map<String,?>[]myDataArray=new HashMap[myData .size()]; 
    
  3. Dizideki verileri listeden al.

    myDataArray=myData.toArray(myDataArry); 
    
0

bu bazı güçlükleri olmuş ama ben sadece mümkün olduğunca paylaşacaktır bir kaç şey anladım var.

jenerik Benim deneyim ile koleksiyonları ile sınırlıdır, bu yüzden gibi, sınıf tanımlarında bunları kullanmak: veri üyesi içeren

public class CircularArray<E> { 

:

private E[] data; 

Yapamazsın yapmak ve genel tür dizisi, bu nedenle yöntemi vardır: yapıcısında

@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 

Bu jenerik jenerik için çalışır, ama ben sıralanabilir olabilecek bir liste gerekli: Comparables bir listesini.

private E[] data; 

Ama yeni sınıf java.lang.ClassCastException atar: veri üyesini içeren

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

yapıcı her şey

@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 
} 

aynıdır:

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

İnşallah yardımcı olur ve hata yaparsam daha deneyimli kullanıcılarımızın beni düzelteceğini umarız. Oracle tutorial itibaren [ sic]

0

: Bana göre

You cannot create arrays of parameterized types. For example, the following code does not compile:

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

The following code illustrates what happens when different types are inserted into an array:

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

If you try the same thing with a generic list, there would be a problem:

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. 

If arrays of parameterized lists were allowed, the previous code would fail to throw the desired ArrayStoreException.

, çok zayıf geliyor. Bence, generikleri yeterince anlayabilen herhangi bir programcı, böyle bir durumda ArrayStoredException'ın atılmamasını mükemmel bir şekilde ve hatta bekleyeceğini düşünür.

Daha programcıların çoğu basitçe yapacak: değil atılmış ArrayStoreException tamamen aynı riskinde koyacağız

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

.

İlgili konular