使用泛型实现接口 java

implementing interface with generics java

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

ImplementableClass.java:

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

    public void insertObject(E obj);

    public E removeObj(E obj);

}

Main.java:

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

    }

    public E removeLastObject(E obj){

    }

    //... main method and others below...
}

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

阅读java文档,Iterable 是 E 类型(泛型值)。据我了解,接口只是 "blueprints" 必须在 class 和 "implements" 中使用的方法。从基本的角度来看,这里不能有任何变数。话虽如此,正如您可能看到的那样,我确实也在 Main 中的 ImplementableClass 中声明了方法。话虽如此,我有几个问题:

  1. 当在我的数组 class 中从 ImplementableClass class 声明我的方法时,这个 "overrides" 来自我的 ImplementableClass class 的方法对吗?

  2. 因为 "E obj" 是两个方法中的参数,所以每当我在数组 class 中声明我的方法时,它们是否必须相同?我应该将什么传递给方法? "E obj" 是什么意思?

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

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

When declaring my methods from ImplementableClass class in my Array class, this "overrides" the methods from my ImplementableClass class right?

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

Since "E obj" is the argument in both methods, do they have to be the same whenever I declare my methods in my Array class? What should I pass to the methods? What does "E obj" mean?

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

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

public class ArrayClass implements ImplementableClass<Integer>

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

public void insertObject(Integer obj) {}

public Integer removeObj(Integer obj) {}

否则你可以使你的数组​​ class 泛型,并将泛型类型的规范留给调用者:

public class ArrayClass<E> implements ImplementableClass<E>

I want to create an array that can hold objects of type E. This means that whenever I instantiate a new object-> Array theArray = new Array I can call the methods I have on my Array class on theArray instance right? (i.e theArray.removeLastObject() ) What should I pass as an argument?

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

Why would Iterable be of use in this case?

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

此外,我建议不要将您的数组命名为 class Array...,也许可以考虑利用现有的 Iterable classes 来构造什么你在做,但这看起来像是一个学习练习,所以试试吧。

HTH

  1. 实际发生的是您正在实现接口,而不是覆盖它。由于接口(在 Java <= 7 中)没有实现,因此您没有什么可以真正覆盖的。您可以从界面使用 @Override 注释 to indicate that you're implementing a method

  2. 您在第二个 class 中对仿制药嗤之以鼻。如果你真的希望它是通用的(也就是说,它可以绑定到 any 对象),那么你需要这样的声明:

    public class Array<E> implements ImplementableClass<E>
    

    <E> 被称为 type parameter,它在 class 级别应用,这意味着 class 中的任何非静态方法或字段都可以使用

    E obj 表示您愿意接受任何类型的对象作为参数。如果您声明 Array<Integer> intArray = new Array<>();,那么 E obj 将在内部转换为 Integer obj。有大量与泛型相关的复杂操作;阅读它会是最好的。

  3. 具体要使用哪种数据结构。 Arrays and generics do not mix well. If you're creating a generic object array (as in, E[] backingStore), then creating a generic array 将是一个需要考虑的因素。

    老实说,我建议您改用 List

  4. Iterable表示你拥有的对象can be iterated with an enhanced-for statement。为什么要这样做取决于您的判断,但这就是您要使用该特定界面的原因。