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 中声明了这些方法。话虽这么说,我有几个问题:
当在我的 Array 类中声明 ImplementableClass 类的方法时,这会“覆盖”我的 ImplementableClass 类中的方法,对吗?
由于“E obj”是两种方法中的参数,因此每当我在 Array 类中声明我的方法时,它们是否必须相同?我应该将什么传递给方法?“E obj”是什么意思?
我想创建一个可以保存 E 类型对象的数组。这意味着每当我实例化一个新对象时,Array<Integer> theArray = new Array<Integer>我都可以在 Array 实例上调用 Array 类上的方法,对吗?(即 theArray.removeLastObject() )我应该传递什么作为参数?
为什么Iterable<E>在这种情况下有用?
当在我的 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类来构造您正在做的事情,但这看起来像是一个学习练习,所以请继续这样做。
华泰