Java接口(interface)和扩展ArrayList

标签 java arraylist interface

我正在尝试理解 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/

相关文章:

java - 使用 binding.xml 重命名 JAXB 根​​类

java - 使用 jcrop 和 java 裁剪图像

user-interface - 在 MonoDevelop 中打开 GUI 设计器

C# 隐藏继承成员

.net - 接口(interface)扩展方法的 C# 命名约定

java - 当 'ACE' 牌出现在我的二十一点游戏手中时,我的算法出现问题

java - 计算两个日期之间的天数,忽略年份

JAVA:查找双数组列表的平均值

android - 如何制作不同类型对象的ArrayList?

java - 使用remove方法之前/之后重新填充arrayList的效果