Как получить объект определенного типа из Object Vector в Java - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть следующее Vector, и во время выполнения я хочу передать ему Integer, Character или Float:

public static Vector<Object> interestingValues = new Vector<Object>();

В то же время я хочу получить от него Integer, Float или Character, поэтому есть две вещи:

  • Сохранят ли они определенный тип Integer / Float / Character в Object Vector или все они будут сохранены в виде Object?

  • Как мне извлечь Integer объектов из этого Vector?

Ответы [ 6 ]

2 голосов
/ 21 апреля 2011

литье:

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);
1 голос
/ 21 апреля 2011

Попробуйте использовать instanceof и приведение:

if(interestingValues.get(0) instanceof Integer){
Integer value = (Integer) interestingValues.get(0);
}
0 голосов
/ 21 апреля 2011

instanceof проверяет освобождение isa.Если вы хотите быть на 100% уверены в классе, используйте getClass ().Вот длинный пример:

public class Blue
{
  private String yargh;

  public Blue()
  {
    yargh = "blue";
  }

  public Blue(final String value)
  {
    yargh = StringUtils.defaultString(value);
  }

  public void println()
  {
    System.out.println(yargh);
  }
}

public class Berry extends Blue
{
  public Berry()
  {
    super("blueberry");
  }
}

... blah blah blah
Vector<Object> stuff = new ... blah blah blah
stuff.add(new blue());
stuff.add(new berry());

Iterator<Object&gt iterator = stuff.iterator();
Object minemine;

// this calls println on two objects.
while (iterator.hasNext())
{
  minemine = iterator.next();
  if (minemine instanceof Blue)
  {
    Blue bluemine = (Blue)minemine;
    bluemine.println();
  }
}

// This calls println for the Blue object, but not the Berry object.
iterator = stuff.iterator();
while (iterator.hasNext())
{
  minemine = iterator.next();
  if (minemine.getClass() == Blue.class)
  {
    Blue bluemine= (Berry)minemine;
    bluemine.println();
  }
}

Caveat emptor: Я не компилировал код выше.

0 голосов
/ 21 апреля 2011

Вы должны проверить класс объекта:

Object obj = myvector.get(0);
if( obj instanceof Integer) {
 Integer myInt = (Integer)obj;  
}
else if( obj instanceof Character ) {
  Integer myChar = (Character)obj; 
}

Это не очень хороший дизайн.Возможно, вы захотите сохранить объекты в разных векторах или использовать представление (например, String) вместе с преобразованием.

Редактировать:

С Float, Integer и т.п.Если вы продлите Number, вы также можете просто проверить obj instanceof Number, а затем вызвать intValue(), doubleValue() и т. д. на приведенном объекте, если вам нужен только номер, а не тип.

0 голосов
/ 21 апреля 2011

Вам нужно будет выполнить итерацию и проверить Integer экземпляров, например:

List<Integer> integers = new ArrayList<Integer>();
for (Object object:interestingValues) {
  if (object instanceof Integer)
     integers.add((Integer) object);
}
0 голосов
/ 21 апреля 2011

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...