使用泛型java实现接口

J T*_*ino 4 java arrays generics interface

我正在编写一些java代码,我想在我的主类Array中编写方法。该类实现了 ImplementableClass。前者扩展了 Iterable。Array 类有一个类型。

实现类.java:

public interface ImplementableClass<E> extends Iterable<E>{

    public void insertObject(E obj);

    public E removeObj(E obj);

}
Run Code Online (Sandbox Code Playgroud)

主要.java:

public class Array<Integer> implements ImplementableClass<E>{
    public void insertObject(E obj){

    }

    public E removeLastObject(E obj){

    }

    //... main method and others below...
}
Run Code Online (Sandbox Code Playgroud)

我对上面两个文件中的代码有一些疑问。

阅读java文档,Iterable是E类型(泛型值)。据我了解,接口只是“实现”它们的类中必须使用的方法的“蓝图”。从基本的角度来看,这里不应该有任何变数。话虽如此,您可能会看到,我确实也在 Main 的 ImplementableClass 中声明了这些方法。话虽这么说,我有几个问题:

  1. 当在我的 Array 类中声明 ImplementableClass 类的方法时,这会“覆盖”我的 ImplementableClass 类中的方法,对吗?

  2. 由于“E obj”是两种方法中的参数,因此每当我在 Array 类中声明我的方法时,它们是否必须相同?我应该将什么传递给方法?“E obj”是什么意思?

  3. 我想创建一个可以保存 E 类型对象的数组。这意味着每当我实例化一个新对象时,Array<Integer> theArray = new Array<Integer>我都可以在 Array 实例上调用 Array 类上的方法,对吗?(即 theArray.removeLastObject() )我应该传递什么作为参数?

  4. 为什么Iterable<E>在这种情况下有用?

Rya*_*n J 5

当在我的 Array 类中声明 ImplementableClass 类的方法时,这会“覆盖”我的 ImplementableClass 类中的方法,对吗?

是的(嗯,从技术上讲不是,因为界面中没有可以覆盖的功能,但您可以使用@Override它来指示您正在覆盖它)

由于“E obj”是两种方法中的参数,因此每当我在 Array 类中声明我的方法时,它们是否必须相同?我应该将什么传递给方法?“E obj”是什么意思?

它们需要与您在实现接口时指定的泛型类型相同。E obj意味着您已经声明了一个名为objthat 的泛型类型参数E。这意味着您需要定义方法以将该特定类型作为参数。

不过,在声明中定义接口的泛型类型会更有意义,例如:

public class ArrayClass implements ImplementableClass<Integer>
Run Code Online (Sandbox Code Playgroud)

所以你可以有这样的方法:

public void insertObject(Integer obj) {}

public Integer removeObj(Integer obj) {}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使 Array 类成为泛型,并将泛型类型的规范留给调用者:

public class ArrayClass<E> implements ImplementableClass<E>
Run Code Online (Sandbox Code Playgroud)

我想创建一个可以保存 E 类型对象的数组。这意味着每当我实例化一个新对象-> Array theArray = new Array 时,我都可以在 theArray 实例上调用 Array 类上的方法,对吧?(即 theArray.removeLastObject() )我应该传递什么作为参数?

为此,您需要使 Array 类变得通用,如上所示。您传入的参数将与您在创建数组时指定的类型相同(Integer在您的示例中)。

为什么 Iterable 在这种情况下有用?

Iterable很有用,因此您可以利用数组的迭代器功能,以及增强的foreach语法 ( for (Object o : someObjectArray) {...})

另外,我建议不要命名您的 Array 类Array……也许可以考虑利用现有的Iterable类来构造您正在做的事情,但这看起来像是一个学习练习,所以请继续这样做。

华泰