У меня есть ArrayList, состоящий из различных элементов, импортированных из базы данных, состоящий из строк, чисел, чисел типа double и int. Есть ли способ использовать технику отражающего типа, чтобы узнать, какие данные хранятся в каждом элементе?
К вашему сведению: причина того, что существует так много типов данных, заключается в том, что это кусок Java-кода, который написан для реализации с разными БД.
java
generics
reflection
arraylist
Человек-ВолкДракон
источник
источник
instanceof
в случае с java?(int) o
не работает на Java. Выдает сообщение об ошибкеCannot cast from Object to int
.(Integer o).intValue()
Вместо этого используйте .Вы можете использовать
getClass()
метод или instanceof. Напримерfor (Object obj : list) { if (obj instanceof String) { ... } }
или
for (Object obj : list) { if (obj.getClass().equals(String.class)) { ... } }
Обратите внимание, что instanceof будет соответствовать подклассам. Например, of
C
является подклассомA
, тогда верно следующее:C c = new C(); assert c instanceof A;
Однако следующее будет ложным:
C c = new C(); assert !c.getClass().equals(A.class)
источник
for (Object object : list) { System.out.println(object.getClass().getName()); }
источник
Вы почти никогда не захотите использовать что-то вроде:
Object o = ... if (o.getClass().equals(Foo.class)) { ... }
потому что вы не учитываете возможные подклассы. Вы действительно хотите использовать Class # isAssignableFrom:
Object o = ... if (Foo.class.isAssignableFrom(o)) { ... }
источник
В Java просто используйте оператор instanceof. Это также позаботится о подклассах.
ArrayList<Object> listOfObjects = new ArrayList<Object>(); for(Object obj: listOfObjects){ if(obj instanceof String){ }else if(obj instanceof Integer){ }etc... }
источник
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()); } } } }
источник
Просто вызовите
.getClass()
каждогоObject
в цикле.К сожалению, в Java нет
map()
. :)источник
Instanceof работает, если вы не зависите от определенных классов, но также помните, что у вас могут быть нули в списке, поэтому obj.getClass () завершится ошибкой, но instanceof всегда возвращает false для null.
источник
Начиная с 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 } });
источник
вместо использования
object.getClass().getName()
вы можете использоватьobject.getClass().getSimpleName()
, потому что он возвращает простое имя класса без имени пакета.например,
Object[] intArray = { 1 }; for (Object object : intArray) { System.out.println(object.getClass().getName()); System.out.println(object.getClass().getSimpleName()); }
дает,
источник
Вы говорите: «Это пишется фрагмент кода Java», из чего я делаю вывод, что все еще есть шанс, что вы могли бы спроектировать его по-другому.
ArrayList - это как набор вещей. Вместо того, чтобы заставлять instanceof или getClass каждый раз, когда вы берете объект из списка, почему бы не спроектировать систему так, чтобы вы получали тип объекта, когда вы получаете его из БД, и сохраняли его в коллекции соответствующего типа объект?
Или вы можете использовать одну из многих существующих библиотек доступа к данным, чтобы сделать это за вас.
источник
Если вы ожидаете, что данные будут числовыми в какой-либо форме, и все, что вам нужно сделать, это преобразовать результат в числовое значение, я бы предложил:
for (Object o:list) { Double.parseDouble(o.toString); }
источник