我正在尝试理解 Java,我在一本教科书中找到了这段代码:
public EArrayList filt(Func a)
{
}
其中 apply 位于名为 Func 的接口(interface)中
我了解此方法在列表上应用函数过滤器并返回过滤后的新列表。但是我不明白为什么 Object elem
用来。我尝试了代码,如果重命名Object
,它将不起作用.
我也无法理解以下行:
if((Boolean)a.apply(elem) == true)
( boolean 值除了返回类型之外还代表什么)
有人可以给我发送一个很好的链接,以便更好地理解它是如何工作的,因为我搜索了很多有关接口(interface)的信息,但从未遇到过这种格式。
最佳答案
...However I can't understand why
Object elem
is used.
可能性是EArrayList
延伸ArrayList
,但没有给它一个类型绑定(bind) - 因此,它可以容纳任何对象。
通常,您会发现 List
具有某种类型绑定(bind)的 s,例如 List<String>
,或List<Integer>
。如果你忽略它,那么你只处理 Object
s。
您还可以使用 Func a
再次执行此操作- 它的类型界限为 <S, T>
,这可以假设您来自 S
类型类型为 T
。但这也被省略了,所以你只处理 Func<Object, Object>
.
这就是这个 Actor 阵容的来源:
(Boolean)a.apply(elem)
您可以省略 == true
部分。您正在检查 boolean 值。
Java 只知道它返回 Object
来自apply
,但您不想要 Object
- 你想要一个Boolean
。 Java 将尝试将其转换为 Boolean
为您,if it can be cast to one 。这可能在运行时崩溃,这意味着这段特定的代码是一个等待AbstractObjectFactoryImpl
的错误。插入到列表中,等待尝试转换为 Boolean
.
这就是您想要使用泛型的原因。 They protect you from runtime failures like that通过在编译时强制执行这些内容,实际上消除了类型转换。
如果使用泛型完成此操作,您将看到如下声明:
// Assuming that there is a generic type T on the class:
public EArrayList<T> filter(Func<Boolean, T> a) {
int size = size();
EArrayList<T> arr = new EArrayList<T>();
for(int i = 0; i < size; i++) {
T elem = get(i);
if(a.apply(elem)) {
arr.add(elem);
}
}
return arr;
}
关于Java接口(interface)和扩展ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792111/