【问题标题】:The correct way of extending an ArrayList and and implementing an interface using Generics扩展 ArrayList 和使用泛型实现接口的正确方法
【发布时间】:2013-12-14 10:33:32
【问题描述】:

我需要实现一个接口,该接口具有两个泛型类型参数和一个方法,该方法将一个泛型类型作为参数,另一个泛型类型作为返回类型。我就是这样实现的,但不知道是不是正确的方法。

public interface Evaluate<K, T> 
{
      T use(K k); 

}

另外,我需要扩展 Java 的 ArrayList 并向其添加方法,例如 map。 map() 方法需要接受一个 Evaluate 类型的参数并返回一个新列表。我不知道我是否应该实现接口以及如何在我的方法中实际传递参数。这是我迄今为止的尝试:

public class Array<K, T> extends java.util.ArrayList<T> implements Evaluate<K,T>
{
    public ArrayList<T> map(Evaluate f1)
    {

    }
}

【问题讨论】:

  • 你的接口叫做 Evaluate 并且你正在实现和使用 Function。什么是评估,什么是函数?
  • 乍一看您的代码看起来还不错,但您遇到的实际问题是什么?
  • 我编辑了代码,因为我有一个错误
  • 你的接口实现还是错的。
  • 你可以再修复一件事。如果您正在扩展 Evaluate 接口,则不需要在 map 中传递 Evaluate 实例(Array 类可以简单地使用它自己的)。如果你想传递它,接口实现是不需要的。

标签: java generics interface


【解决方案1】:

要么这样做:

public class Array<K, T> extends java.util.ArrayList<T> implements Evaluate<K,T> {
    T use(K k) {
        // implementation
    }

    public java.util.ArrayList<T> map() {
        // use(K) somewhere here
    }
}

public class Array<K, T> extends java.util.ArrayList<T> {
    public java.util.ArrayList<T> map(Evaluate<K,T> evaluate) {
        // use evaluate somewhere here
    }
}

您的实现没有在接口中声明T use(K) 的定义 - 您只能在抽象类或扩展另一个类的接口中保留它未实现。此外,您的论点是原始的,因为您没有像 map(Evaluate&lt;K,T&gt; f1) 那样编写它(Java 不会自动替换泛型参数)。

【讨论】:

  • 你的意思是:“你的实现没有在接口中声明的 T use(K) 的定义”?接口中的方法不应该留下一个空的主体吗?另外,为什么它给我错误:ArrayList 无法解析为类型?
  • 你写了implements Evaluate&lt;K,T&gt; 而你的Array 类不是抽象的。这意味着在Array 类中必须有一些T use(K k) 实现,否则文件将无法编译。接口必须只有声明,它的非抽象实现必须有它们。我添加了缺少的java.util.,但是,老实说,当我看到有人在为如此简单的编译器错误而苦苦挣扎时,我想知道他是否应该已经跳入更高级的东西,比如编写自己的泛型类。
  • 感谢您的帮助。
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多