Как получить объект определенного типа из объектного вектора в Java

#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();
 }
}

Предостережение: я не дополнял приведенный выше код.