【问题标题】:I have a Collection of Multiple Classes, I need one iterator and that object casted我有一个多个类的集合,我需要一个迭代器和那个对象
【发布时间】:2019-03-26 10:54:46
【问题描述】:

我有一个 ArrayList,我有一个不同对象的集合

然后我有一个迭代器


for(Iterator i = results.iterator(); i.hasNext();) {

Object row = i.next();

问题是我有多个使用它的类。例如 User.class。我如何确保我得到了那个对象

User u = (User) row?

【问题讨论】:

  • 您不使用原始的ArrayList 或原始的Iterator。您声明您的列表包含特定类型,例如ArrayList<User>。除非有令人信服的理由,否则不要对多种类型使用相同的列表。
  • 可以不应该使用instanceof运算符
  • 那是糟糕的设计。您的 List 应该包含一种类型或相同类型的子类,而不是任意对象。
  • 如果您有代码,请更改设计。
  • @S.Iqbal 不要尝试扩展损坏的代码,修复它!

标签: java casting iterator


【解决方案1】:

使用 instanceof !

 for(Iterator i = results.iterator(); i.hasNext();) {

    Object row = i.next();

    if (row instanceof User) {
       User u = (User) row; // this is safe
       // ...
    }

 }

有多种类型

 for(Iterator i = results.iterator(); i.hasNext();) {

    Object row = i.next();

    if (row instanceof User) {
       User u = (User) row; // this is safe
       // ...
    } else if (row instanceof Stuff) {
       Stuff u = (Stuff) row; // this is safe
       // ...
    }

 }

在一个通用列表中有多种类型

 Collection<? extends Human> results = ... ;
 for(Human h : results) {

    if (h instanceof User) {
       User u = (User) h; // this is safe
       // ...
    } else if (h instanceof Man) {
       Man m = (Man) h; // this is safe
       // ...
    } else if (row instanceof Woman) {
       Woman w = (Woman) h; // this is safe
       // ...
    }

 }

foreach 变体

for (Object row : results) {
    if (row instanceof User) {
       User u = (User) row; // this is safe
       // ...
    }
}

java 8 变种

results.stream().filter(row -> row instanceof User).map(row -> (User) row).forEach(user -> {...});

HTH!

【讨论】:

  • 使用原始类型的设计很糟糕。无论如何都不推荐。
  • @RealSkeptic OP 说他的集合中有多种类型。
  • @Highbrainer 至少使用像Collection&lt;?&gt;这样的通配符
  • @Lino 我对泛型没有问题,我的示例代码不包含定义!请注意,在列表类型中声明祖先并不意味着您必须对集合中的每个实际子实例具有完全相同的行为。我更新了我的答案以(有点?)更有帮助 - 希望。
猜你喜欢
  • 2017-08-10
  • 2011-07-15
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多