使用泛型实现接口 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 中声明了方法。话虽如此,我有几个问题:
当在我的数组 class 中从 ImplementableClass class 声明我的方法时,这个 "overrides" 来自我的 ImplementableClass class 的方法对吗?
因为 "E obj" 是两个方法中的参数,所以每当我在数组 class 中声明我的方法时,它们是否必须相同?我应该将什么传递给方法? "E obj" 是什么意思?
我想创建一个可以容纳 E 类型对象的数组。这意味着无论何时我实例化一个新对象-> Array<Integer> theArray = new Array<Integer>
我都可以调用数组中的方法class 在 theArray 实例上,对吗? (即 theArray.removeLastObject() )我应该将什么作为参数传递?
为什么 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
实际发生的是您正在实现接口,而不是覆盖它。由于接口(在 Java <= 7 中)没有实现,因此您没有什么可以真正覆盖的。您可以从界面使用 @Override
注释 to indicate that you're implementing a method。
您在第二个 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
。有大量与泛型相关的复杂操作;阅读它会是最好的。
具体要使用哪种数据结构。 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
。
Iterable
表示你拥有的对象can be iterated with an enhanced-for statement。为什么要这样做取决于您的判断,但这就是您要使用该特定界面的原因。
我正在编写一些 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 中声明了方法。话虽如此,我有几个问题:
当在我的数组 class 中从 ImplementableClass class 声明我的方法时,这个 "overrides" 来自我的 ImplementableClass class 的方法对吗?
因为 "E obj" 是两个方法中的参数,所以每当我在数组 class 中声明我的方法时,它们是否必须相同?我应该将什么传递给方法? "E obj" 是什么意思?
我想创建一个可以容纳 E 类型对象的数组。这意味着无论何时我实例化一个新对象->
Array<Integer> theArray = new Array<Integer>
我都可以调用数组中的方法class 在 theArray 实例上,对吗? (即 theArray.removeLastObject() )我应该将什么作为参数传递?为什么
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
实际发生的是您正在实现接口,而不是覆盖它。由于接口(在 Java <= 7 中)没有实现,因此您没有什么可以真正覆盖的。您可以从界面使用
@Override
注释 to indicate that you're implementing a method。您在第二个 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
。有大量与泛型相关的复杂操作;阅读它会是最好的。具体要使用哪种数据结构。 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
。Iterable
表示你拥有的对象can be iterated with an enhanced-for statement。为什么要这样做取决于您的判断,但这就是您要使用该特定界面的原因。