Jak mogę sprawić, aby tego typu rzeczy działały? Mogę sprawdzić, czy jest to (obj instanceof List<?>)
, ale nie, jeśli (obj instanceof List<MyType>)
. Czy jest sposób, aby to zrobić?jak do instanceof List <MyType>?
Odpowiedz
Nie jest to możliwe, ponieważ typ danych wymazuje się podczas kompilacji generycznych. Jedynym możliwym sposobem osiągnięcia tego celu jest napisanie jakiegoś owijki, która posiada jaki typ posiada listy:
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;
}
}
ok czy jest inny sposób na sprawdzenie? –
Dzięki, myślę, że po prostu przekażę rodzajowy typ do funkcji, do której dzwonię, aby sprawdzić i sprawdzić oba elementy. –
prawdopodobnie trzeba użyć refleksji uzyskać rodzaje nich sprawdzić. Aby uzyskać typ listy: Get generic type of java.util.List
O ile mi wiadomo, działa to tylko dla pól, ale +1 dla wzmianki o nim. –
if(!myList.isEmpty() && myList.get(0) instanceof MyType){
// MyType object
}
... i dla pustej listy? Refleksje? – Gewure
Yeap. To jedyna dostępna opcja dla pustej listy. https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list – Sathish
Ta odpowiedź nie jest bezpieczna, ponieważ nawet jeśli elementem 0 jest MyType, pozostałe elementy mogą być innymi typami . Na przykład, może lista została zadeklarowana jako ArrayList
Jeśli sprawdzenie czy odwołanie z listy lub mapy wartości obiekt jest instancją Collection, wystarczy utworzyć instancję wymaganego listy i uzyskać jego klasa ...
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());
Jaki jest sens "setOfIntegers" i "setOfStrings"? – DanielM
@DanielM właśnie zaktualizował próbkę. Musi używać tych odniesień! Dzięki! –
Jeśli to nie może być owinięty generycznych (@ odpowiedź Martijn jest) lepiej przekazać go bez odlewania, aby uniknąć redundantny listy iteracji (sprawdzanie typu pierwszego elementu gwarantuje niczego). Możemy rzutować każdy element w kodzie, w którym wykonujemy iterację listy.
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);
}
}
Można użyć fałszywego fabryki obejmuje wiele metod Zamiast używać instanceof:
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);
}
}
To może być stosowane, jeżeli chcesz sprawdzić, object
jest instancją List<T>
, która nie jest pusta:
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.
}
}
- 1. Sprawdź, który typ obiektu List <?> zawiera
- 2. Jak napisać List <> na działce
- 3. instanceof z kolekcją generyczną
- 4. C# List <> XML
- 5. Kiedy używasz instanceof właściwej decyzji?
- 6. Java - czy istnieje "podklasa" podobna do instanceof?
- 7. Array List <File> do Array File []
- 8. instancji właściwość typu List <>
- 9. Słownik Javy <String, List <Object>>
- 10. Dostęp do VBA równoważny z C# List <T>
- 11. List <custom> do programu Excel C#
- 12. instanceof i nazw
- 13. C# Casting a List <ObjBase> jako List <Obj>
- 14. List <string> INotifyPropertyChanged event
- 15. instanceof w Grails
- 16. Użyj instanceof w Thymeleaf
- 17. instanceof vs isinstance()
- 18. niepoprawny operator <podczas sortowania std :: list
- 19. JavaScript instanceof if
- 20. Konwersja ICollectionView to List <T>
- 21. Umów List <> w kolejności rosnącej
- 22. Group i Sum List <object[]>
- 23. Initialize List <> z Arrays.asList
- 24. Way wypełnić List <> z elementami
- 25. <c: foreach jsp iterate over list
- 26. dlaczego instanceof nie działa z Generic?
- 27. C# List <object> .RemoveAll() - Jak usunąć podzbiór listy?
- 28. Java: Instanceof i Generics
- 29. C++ odpowiednik instanceof
- 30. Jak wykonać test instanceof z Scala (Test)
Zobacz http://docs.oracle.com/javase/tutorial/java/generics/erasure.html –
możliwe duplikat [nie można wykonać instanceof sprawdzić przed parameteri zed type ArrayList] (http://stackoverflow.com/questions/7335018/cannot-perform-instanceof-check-against-parameterized-type-arraylistfoo) –