#java #object #vector #floating-point #integer
#java #объект #вектор #с плавающей запятой #целое
Вопрос:
У меня есть следующее, Vector
и во время выполнения я хочу передать ему Integer
, Character
или Float
:
public static Vector<Object> interestingValues = new Vector<Object>();
В то же время я хочу получить из него Integer
, Float
или Character
, поэтому есть две вещи:
-
Будут ли они сохранять определенный
Integer
/Float
/Character
тип вObject
Vector
, или все они будут сохранены в видеObject
? -
Как я могу извлечь
Integer
объекты из этогоVector
?
Комментарии:
1. Когда у вас есть коллекция смешанных типов, обычно лучше определить класс с полями этих типов.
2. Vector — это старый класс, вам следует использовать новую платформу Java Collections Framework. Смотрите download.oracle.com/javase/tutorial/collections/index.html
Ответ №1:
Кастинг:
Integer i=(Integer)interestingValues.get(0);
В случае, если у вас есть несколько типов объектов внутри вектора, вы можете проверить тип с помощью instanceof
:
Object o=interestingValues.get(0);
if (o instanceof Integer){
Integer i=(Integer)o;
}else if (o instanceof Long){
Long l=(Long)o;
}
Третье, что вы можете сделать, чтобы избежать необходимости приведения объектов к определенному типу, — это использовать типизированный Vector
:
Vector <Integer> integerVector=new Vector<Integer>();
integerVector.add(Integer.MAX_VALUE);
Integer i=integerVector.get(0);
Ответ №2:
Попробуйте использовать instanceof и приведение :
if(interestingValues.get(0) instanceof Integer){
Integer value = (Integer) interestingValues.get(0);
}
Ответ №3:
Vector
Хранит только ссылку на объект, а не сам объект.
Однако, поскольку (не универсальный) класс определен как хранящий ссылки на Object
, вы должны привести сохраненные ссылки обратно к исходному типу перед их использованием:
String s = (String)myVector.get(n);
Это, конечно, требует, чтобы вы заранее знали, какой конкретный тип хранится в каком элементе…
Вы могли бы сделать:
Object o = myVector.get(n);
if (o instance String) {
// do string stuff
} else if (o instanceof Integer) {
// do integer stuff
} etc
Ответ №4:
Вам придется выполнять итерации и проверять Integer
экземпляры, например:
List<Integer> integers = new ArrayList<Integer>();
for (Object object:interestingValues) {
if (object instanceof Integer)
integers.add((Integer) object);
}
Ответ №5:
Вам нужно было бы проверить класс объекта:
Object obj = myvector.get(0);
if( obj instanceof Integer) {
Integer myInt = (Integer)obj;
}
else if( obj instanceof Character ) {
Integer myChar = (Character)obj;
}
Хотя это не очень хороший дизайн. Возможно, вы захотите сохранить объекты в разных векторах или использовать общее представление (например, строку) вместе с преобразованием.
Редактировать:
Поскольку Float
, Integer
и подобные им все расширяются, Number
вы также можете просто проверить obj instanceof Number
, а затем вызвать intValue()
, doubleValue()
и т.д. Для приведенного объекта, если все, что вам нужно, это число, а не тип.
Ответ №6:
instanceof проверяет связь «isa». Если вы хотите быть на 100% уверены в классе, используйте getClass() . вот длинный пример:
открытый класс Blue { частная строка yargh; public Blue() { yargh = "синий"; } общедоступный синий (конечное строковое значение) { yargh = StringUtils.defaultString(значение); } public void println() { System.out.println(yargh); } } общедоступный класс Berry расширяет Blue { public Berry() { super("черничный"); } } ... бла-бла-бла Vector<Object> stuff = new ... бла-бла-бла stuff.add(новый синий()); stuff.add(новая ягода()); Итератор<Объект> iterator = stuff.iterator(); Объект minemine; // это вызывает println для двух объектов. while (iterator.hasNext()) { minemine = iterator.next(); если (minemine instanceof Blue) { Синий bluemine = (Синий)minemine; bluemine.println(); } } // Это вызывает println для объекта Blue, но не для объекта Berry. итератор = stuff.iterator(); while (iterator.hasNext()) { minemine = iterator.next(); if (minemine.getClass() == Blue.class ) { Синий bluemine= (Berry)minemine; bluemine.println(); } }
Предостережение: я не дополнял приведенный выше код.