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){}
可能吗?写它的正确方法怎么样?
你所知道的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循环你会写什么- 你仍然需要写演员,不是吗?
当然,如果您知道列表实际上只包含一个特定类型,则始终可以无条件地在循环中进行转换.
我试图在网络上找到如何为扩展对象编写这个 for 循环,例如这样的东西
for (? extends Results res: results){}
Run Code Online (Sandbox Code Playgroud)
不,这是不可能的:您无法静态键入在运行时动态提供的项目。
正确的写法是怎样的呢?
你已经在这样做了:
for (Results res: results) {
}
Run Code Online (Sandbox Code Playgroud)
如果您想测试Special2Result
该循环的内部,您可以这样做,但通常它表明您的设计可以改进。更好的选择是使用双重调度机制,例如访问者模式,来隐藏子类特殊处理的细节。