2012-04-11 23 views
53

Bu tür şeyleri nasıl çalıştırabilirim? (obj instanceof List<?>)'un olup olmadığını kontrol edebilirim ancak (obj instanceof List<MyType>). Bunun bir yolu var mı?Liste Insignceof <MyType> nasıl?

+1

Bkz http://docs.oracle.com/javase/tutorial/java/generics/erasure.html parameteri karşı kontrol instanceof işlemi gerçekleştirilemiyor [ait –

+0

olası yinelenen zed type ArrayList ] (http://stackoverflow.com/questions/7335018/cannot-perform-instanceof-check-against-parameterized-type-arraylistfoo) –

cevap

35

Bu, jeneriklerin derleme zamanında veri türü silinmesi nedeniyle mümkün değildir.

public class GenericList <T> extends ArrayList<T> 
{ 
    private Class<T> genericType; 

    public GenericList(Class<T> c) 
    { 
      this.genericType = c; 
    } 

    public Class<T> getGenericType() 
    { 
      return genericType; 
    } 
} 
+0

tamam kontrol etmek için alternatif bir yol var mı? –

+0

Teşekkürler, sanırım genel türü, her iki öğeyi de kontrol etmek ve kontrol etmek için çağırdığım işleve ileteceğim. –

8

Muhtemelen kontrol etmek bunların türlerini almak için yansıma kullanmak gerekir: Bunu yapmanın tek mümkün yolu liste tutan tip tutan sarıcı çeşit yazmaktır. Listesinin tipini almak için: Nesne bir Liste veya Harita değerin bir referans bir Koleksiyonu örneğidir ise doğruluyorsanız Get generic type of java.util.List

+1

Bildiğim kadarıyla, bu yalnızca alanlar için çalışıyor, ama sözünü belirtmek için +1. –

16
if(!myList.isEmpty() && myList.get(0) instanceof MyType){ 
    // MyType object 
} 
+0

... ve boş bir liste için? Yansımalar? – Gewure

+0

Yeap. Boş liste için mevcut olan tek seçenek budur. https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list – Sathish

+1

Bu yanıt güvenli değildir, çünkü 0 öğesi bir MyType olsa bile, diğer öğeler başka türde olabilir . Örneğin, liste ArrayList olarak bildirilmiş olabilir, daha sonra bir MyType eklenmiş ve ardından bir Dize eklenmiştir. –

0

, sadece gerekli listesi örneğini oluşturmak ve almak onun sınıf ... Bu ise

Set<Object> setOfIntegers = new HashSet(Arrays.asList(2, 4, 5)); 
assetThat(setOfIntegers).instanceOf(new ArrayList<Integer>().getClass()); 

Set<Object> setOfStrings = new HashSet(Arrays.asList("my", "name", "is")); 
assetThat(setOfStrings).instanceOf(new ArrayList<String>().getClass()); 
+0

"setOfIntegers" ve "setOfStrings" inizin anlamı nedir? – DanielM

+0

@DanielM sadece örneği güncelledi. Bu referansları kullanıyor olmalı! Teşekkürler! –

0

(Martijn cevabı @) o (ilk öğenin tip hiçbir şey garanti kontrol) gereksiz liste iterasyon önlemek için döküm olmadan geçmek daha iyidir jenerik ile sarılmış edilemez. Her öğeyi, listeyi yinelediğimiz kod parçasına atayabiliriz.

Object attVal = jsonMap.get("attName"); 
List<Object> ls = new ArrayList<>(); 
if (attVal instanceof List) { 
    ls.addAll((List) attVal); 
} else { 
    ls.add(attVal); 
} 

// far, far away ;) 
for (Object item : ls) { 
    if (item instanceof String) { 
     System.out.println(item); 
    } else { 
     throw new RuntimeException("Wrong class ("+item .getClass()+") of "+item); 
    } 
} 
0

yerine instanceof kullanmanın birçok yöntemlerini içerecek şekilde sahte fabrika kullanabilirsiniz: Eğer object olmadığını kontrol etmek istiyorsanız

public class Message1 implements YourInterface { 
    List<YourObject1> list; 
    Message1(List<YourObject1> l) { 
     list = l; 
    } 
} 

public class Message2 implements YourInterface { 
    List<YourObject2> list; 
    Message2(List<YourObject2> l) { 
     list = l; 
    } 
} 

public class FactoryMessage { 
    public static List<YourInterface> getMessage(List<YourObject1> list) { 
     return (List<YourInterface>) new Message1(list); 
    } 
    public static List<YourInterface> getMessage(List<YourObject2> list) { 
     return (List<YourInterface>) new Message2(list); 
    } 
} 
0

Bu kullanılabilecek boş değil, hangi List<T> örneği geçerli:

if(object instanceof List){ 
    if(((List)object).size()>0 && (((List)object).get(0) instanceof MyObject)){ 
     // The object is of List<MyObject> and is not empty. Do something with it. 
    } 
} 
İlgili konular