用泛型java实现接口

时间:2015-02-18 04:14:26

标签: java arrays generics interface

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

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类型(通用值)。据我所知,接口只是必须在“实现”它们的类中使用的方法的“蓝图”。从基本的角度来看,这里不应有任何变数。话虽如此,正如您所看到的那样,我确实在Main中的ImplementableClass中声明了方法。话虽如此,我还有几个问题:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

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

public class ArrayClass implements ImplementableClass<Integer>

所以您可以使用以下方法:

public void insertObject(Integer obj) {}

public Integer removeObj(Integer obj) {}

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

public class ArrayClass<E> implements ImplementableClass<E>
  

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

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

  

为什么在这种情况下可以使用Iterable?

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

另外,我建议不要命名你的Array类Array ......也许会考虑利用已经存在的Iterable类构建你正在做的事情,但这看起来像一个学习运动,所以有它。

HTH

答案 1 :(得分:0)

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

  2. 你对第二堂课中的仿制品很着迷。如果你真的希望它是通用的(也就是说,它可以绑定到任何对象),那么你需要这个声明:

    public class Array<E> implements ImplementableClass<E>
    

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

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

  3. 具体,了解您要使用的数据结构类型。 Arrays and generics do not mix well.如果您要创建通用对象数组(如E[] backingStore),那么creating a generic array将是需要考虑的因素。

    老实说,我建议你改用List

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