我正在尝试理解Java,我在教科书中找到了这段代码:
public EArrayList filt(Func a)
{
}
其中apply位于名为Func的接口中
我知道这个方法在列表上应用了一个函数过滤器并返回一个过滤的新列表。但是,我无法理解为什么使用Object elem
。我尝试了代码,如果我重命名Object
,它就无法工作
我也无法理解以下内容:
if((Boolean)a.apply(elem) == true)
(布尔代表返回类型除外)
有人可以给我一个很好的链接,以便更好地了解这是如何工作的,因为我搜索了很多关于接口的内容并且从未遇到过这种格式。
答案 0 :(得分:1)
......但是我无法理解为什么使用
Object elem
。
可能是EArrayList
扩展ArrayList
,但没有给它一个类型绑定 - 因此,它可以容纳任何对象。
通常,您会发现某些类型受限的List
,例如List<String>
或List<Integer>
。如果省略,那么您只处理Object
s。
您还使用Func a
再次执行此操作 - 它的类型范围为<S, T>
,可以假设您从S
类型转换为类型T
。但这也被省略了,所以你只处理Func<Object, Object>
。
这就是演员阵容的来源:
(Boolean)a.apply(elem)
您可以省略== true
部分。你正在检查布尔值。
Java只知道它从Object
返回apply
,但您不想要Object
- 您想要Boolean
。 Java将尝试将其转换为Boolean
,if it can be cast to one。那个可以在运行时爆炸,这意味着这段特殊的代码是等待将AbstractObjectFactoryImpl
插入列表,等待尝试强制转换为{{1 }}
这就是你想使用泛型的原因。 They protect you from runtime failures like that通过在编译时强制执行此操作,实际上消除了类型转换。
如果用泛型完成,你会看到这样的声明:
Boolean