Mam ArrayList składającą się z różnych elementów zaimportowanych z bazy danych, składających się z ciągów, liczb, podwójnych i int. Czy istnieje sposób na użycie techniki typu odbicia, aby dowiedzieć się, jakie typy danych przechowuje każdy element?
FYI: Powodem, dla którego istnieje tak wiele typów danych, jest to, że jest to fragment kodu Java, który został napisany w celu zaimplementowania w różnych bazach danych.
java
generics
reflection
arraylist
WolfmanDragon
źródło
źródło
instanceof
w przypadku Java?(int) o
nie działa w Javie. Generuje komunikat o błędzieCannot cast from Object to int
. Użyj(Integer o).intValue()
zamiast tego.Możesz użyć
getClass()
metody lub możesz użyć instanceof. Na przykładfor (Object obj : list) { if (obj instanceof String) { ... } }
lub
for (Object obj : list) { if (obj.getClass().equals(String.class)) { ... } }
Zauważ, że instanceof będzie pasował do podklas. Na przykład of
C
jest podklasą klasyA
, wtedy spełnione będą następujące warunki:C c = new C(); assert c instanceof A;
Jednak następujące informacje będą fałszywe:
C c = new C(); assert !c.getClass().equals(A.class)
źródło
for (Object object : list) { System.out.println(object.getClass().getName()); }
źródło
Prawie nigdy nie chcesz, abyś używał czegoś takiego jak:
Object o = ... if (o.getClass().equals(Foo.class)) { ... }
ponieważ nie bierzesz pod uwagę możliwych podklas. Naprawdę chcesz użyć klasy # isAssignableFrom:
Object o = ... if (Foo.class.isAssignableFrom(o)) { ... }
źródło
W Javie wystarczy użyć operatora instanceof. To również zajmie się podklasami.
ArrayList<Object> listOfObjects = new ArrayList<Object>(); for(Object obj: listOfObjects){ if(obj instanceof String){ }else if(obj instanceof Integer){ }etc... }
źródło
import java.util.ArrayList; /** * @author potter * */ public class storeAny { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Object> anyTy=new ArrayList<Object>(); anyTy.add(new Integer(1)); anyTy.add(new String("Jesus")); anyTy.add(new Double(12.88)); anyTy.add(new Double(12.89)); anyTy.add(new Double(12.84)); anyTy.add(new Double(12.82)); for (Object o : anyTy) { if(o instanceof String){ System.out.println(o.toString()); } else if(o instanceof Integer) { System.out.println(o.toString()); } else if(o instanceof Double) { System.out.println(o.toString()); } } } }
źródło
Po prostu zadzwoń
.getClass()
do każdegoObject
w pętli.Niestety Java nie ma
map()
. :)źródło
Instanceof działa, jeśli nie jesteś zależny od określonych klas, ale pamiętaj również, że możesz mieć na liście wartości null, więc obj.getClass () nie powiedzie się, ale instanceof zawsze zwraca false dla null.
źródło
Ponieważ Java 8
mixedArrayList.forEach((o) -> { String type = o.getClass().getSimpleName(); switch (type) { case "String": // treat as a String break; case "Integer": // treat as an int break; case "Double": // treat as a double break; ... default: // whatever } });
źródło
zamiast używać
object.getClass().getName()
możesz użyćobject.getClass().getSimpleName()
, ponieważ zwraca prostą nazwę klasy bez dołączonej nazwy pakietu.na przykład,
Object[] intArray = { 1 }; for (Object object : intArray) { System.out.println(object.getClass().getName()); System.out.println(object.getClass().getSimpleName()); }
daje,
źródło
Mówisz "to jest napisany kawałek kodu java", z czego wnioskuję, że wciąż istnieje szansa, że mógłbyś go zaprojektować w inny sposób.
Posiadanie ArrayList jest jak posiadanie kolekcji rzeczy. Zamiast wymuszać instancję lub getClass za każdym razem, gdy bierzesz obiekt z listy, dlaczego nie zaprojektować systemu tak, aby uzyskać typ obiektu podczas pobierania go z bazy danych i zapisać go w kolekcji odpowiedniego typu obiekt?
Możesz też użyć jednej z wielu istniejących bibliotek dostępu do danych, aby zrobić to za Ciebie.
źródło
Jeśli spodziewasz się, że dane będą w jakiejś formie liczbowe, a wszystko, co jesteś zainteresowany, to konwersja wyniku na wartość liczbową, proponuję:
for (Object o:list) { Double.parseDouble(o.toString); }
źródło