我正在写一些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中声明了方法。话虽如此,我还有几个问题:
在我的Array类中从ImplementableClass类声明我的方法时,这会“覆盖”我的ImplementableClass类中的方法吗?
由于“E obj”是两种方法中的参数,每当我在Array类中声明我的方法时,它们是否必须相同?我该怎样传递给方法? “E obj”是什么意思?
我想创建一个可以容纳E类对象的数组。这意味着每当我实例化一个新对象时 - > Array<Integer> theArray = new Array<Integer>
我可以在theArray实例上调用我在Array类上的方法吗? (即theArray.removeLastObject())我应该将什么作为参数传递?
为什么Iterable<E>
会在这种情况下使用?
答案 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)
实际发生的是您正在实施界面,而不是覆盖界面。由于接口(在Java&lt; = 7中)没有实现,因此没有什么可以真正覆盖。您可以使用界面中的@Override
注释to indicate that you're implementing a method。
你对第二堂课中的仿制品很着迷。如果你真的希望它是通用的(也就是说,它可以绑定到任何对象),那么你需要这个声明:
public class Array<E> implements ImplementableClass<E>
<E>
被称为type parameter,并且它在类级别应用,这意味着类中的任何非静态方法或字段都可以使用它。
E obj
表示你愿意接受任何类型的对象作为参数。如果您声明Array<Integer> intArray = new Array<>();
,则E obj
会在内部转换为Integer obj
。有很多与泛型相关的复杂操作;阅读它会是最好的。
具体,了解您要使用的数据结构类型。 Arrays and generics do not mix well.如果您要创建通用对象数组(如E[] backingStore
),那么creating a generic array将是需要考虑的因素。
老实说,我建议你改用List
。
Iterable
表示您拥有的对象can be iterated with an enhanced-for statement。为什么你想要这样做取决于你自己的判断,但这就是你想要使用那个特定界面的原因。