Java:对于每个循环,迭代扩展对象

Mic*_*ael 7 java polymorphism foreach

我的问题可能很简单,

我有一个Result内部领域,制定者和吸气剂的课程.

此外,我有Special1Result一个扩展的类,Result包括几个字段和Special2Result一些更多的数据.

在不同的课程中Dispatcher,我写了以下方法:

processResults(List<? extends Result> results),这只是熟悉Result(我需要这个方法来查询扩展的Result对象中是否有特定的字段 - 我正在使用注释).

所以我决定使用扩展for-each循环: for (Result res : results) {}

那么我的问题是什么?我试图通过网络找到如何写这个for循环的扩展对象,例如像这样的东西for (? extends Results res: results){}

可能吗?写它的正确方法怎么样?

Jon*_*eet 5

你所知道的List<? extends Result>就是每个元素都是Result- 所以你可以把它放在增强的for循环语法中.

如果您需要未声明的成员,则Result需要在循环内部进行强制转换:

for (Result result : results) {
    if (result instanceof CleverResult) {
        CleverResult clever = (CleverResult) result;
        // Use clever here
    }
}
Run Code Online (Sandbox Code Playgroud)

想想如果你没有使用增强的for循环你会写什么- 你仍然需要写演员,不是吗?

当然,如果您知道列表实际上只包含一个特定类型,则始终可以无条件地在循环中进行转换.


das*_*ght 3

我试图在网络上找到如何为扩展对象编写这个 for 循环,例如这样的东西

for (? extends Results res: results){}
Run Code Online (Sandbox Code Playgroud)

不,这是不可能的:您无法静态键入在运行时动态提供的项目。

正确的写法是怎样的呢?

你已经在这样做了:

for (Results res: results) {
}
Run Code Online (Sandbox Code Playgroud)

如果您想测试Special2Result该循环的内部,您可以这样做,但通常它表明您的设计可以改进。更好的选择是使用双重调度机制,例如访问者模式,来隐藏子类特殊处理的细节。