用泛型java实现接口

用泛型java实现接口,java,arrays,generics,interface,Java,Arrays,Generics,Interface,我正在编写一些java代码,我想在我的主类数组中编写方法。这个类实现了ImplementableClass。前者是不可容忍的。数组类具有一个类型 ImplementableClass.java: public interface ImplementableClass<E> extends Iterable<E>{ public void insertObject(E obj); public E removeObj(E obj); } Main.j

我正在编写一些java代码,我想在我的主类数组中编写方法。这个类实现了ImplementableClass。前者是不可容忍的。数组类具有一个类型

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类声明方法时,这会覆盖ImplementableClass类中的方法,对吗

既然E obj是这两个方法中的参数,那么每当我在Array类中声明我的方法时,它们必须是相同的吗?我应该将什么传递给方法?E obj是什么意思

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

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

在数组类中从ImplementableClass类声明方法时,这会覆盖ImplementableClass类中的方法,对吗

是的,从技术上讲不是这样,因为在接口中没有可以覆盖的功能,但是可以使用@override来表示您正在覆盖它

既然E obj是这两个方法中的参数,那么每当我在Array类中声明我的方法时,它们必须是相同的吗?我应该将什么传递给方法?E obj是什么意思

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

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

public class ArrayClass implements ImplementableClass<Integer>
或者,您可以将数组类设置为泛型,并将泛型类型的规范留给调用方:

public class ArrayClass<E> implements ImplementableClass<E>
我想创建一个可以容纳E类型对象的数组。这意味着每当我实例化一个新对象->数组theArray=new array时,我都可以调用array实例上array类上的方法,对吗?i、 e theArray.removeLastObject我应该传递什么作为参数

为了做到这一点,您需要将数组类设置为泛型,如上图所示。传入的参数与在示例中创建数组整数时指定的类型相同

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

Iterable很有用,因此您可以利用数组的迭代器特性,以及对象o:someObjectArray{…}的增强foreach语法

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


实际发生的是,您正在实现接口,而不是覆盖它。因为Java中的接口不支持公共类数组实现可实现类{更有意义吗?谢谢你这么详细的回答。当我按照你的建议让我的类泛型公共类数组实现可实现类时,Eclipse抱怨说:E无法解析为类型。你知道为什么会发生这种情况吗?谢谢!@JTarantino你可能在某个地方有一个悬而未决的类型参数,它从来没有被命名为类型在编译时使用e。最常见的情况是,当您声明创建对象的调用程序无法命名的泛型类型时,通常是由于类型冲突或键入错误。谢谢!另一个愚蠢的问题…泛型类型到底是什么?是Java定义的泛型类型还是我随机选择的泛型类型?再次感谢f或者您的帮助!@JTarantino是一个类型参数,用于标识一个尚未可知的类型,但一旦创建了对该类的引用,该类型将成为该类的引用。E是标识泛型类的符号的任意选择。通常,您会经常看到这些参数使用T或E,但这只是大多数人使用的惯例.谢谢你的帮助!你解决了我关于这件事的所有问题。也许你能帮我解决这个问题?
public class ArrayClass<E> implements ImplementableClass<E>
public class Array<E> implements ImplementableClass<E>