我目前正在学习泛型,并且我有一个任务,必须制作一个带有T类型参数和一个数组数据成员以及一些方法(setItem,getItem,visitor,condition和addAll)的Array类。我对addAll方法有疑问:
public class Array<T> {
private T[] array;
public Array(T[] array){
this.array = array;
}
public void setItem(int i, T item){
if (i < 0 || i > array.length) {
System.out.println("There is no this value in the array!");
}
array[i] = item;
}
public T getItem(int i){
if (i < 0 || i > array.length) {
System.out.println("There is no this item in the array!");
}
return array[i];
}
public <E> boolean addAll(Collection<? extends E> c){
boolean modified = false;
for (E e : c){
if (c.add(e)){
modified = true;
}
}
return modified;
}
}
NB不接受添加方法中的e
。我不知道为什么...。如果我在方法(public boolean addAll(Collection <? extends T>
c){})中使用T类型参数而不是E,则情况是相同的。我收到一条消息,指出不兼容的类型:E无法转换为CAP#1,其中E是类型变量,而CAP#1是新的类型变量。我在做什么错了?
我的第二个问题是使用抽象的Condition类的Array类,它有6个子类。 andCondition,orCondition等都可以,但是GreaterCondition和doubleCondition不起作用。我知道问题出在哪里,但是我找不到解决方案。首先,我仅在类名之后使用<T>
,然后尝试以下<T extends Number>
,但没有任何变化:
public abstract class Condition<T> {
public abstract boolean condition(T item);
}
public class doubleCondition<T extends Number> extends Condition<T> {
public DoubleCondition (){
}
@Override
public boolean condition(T item) {
if (item % 2 == 0){
return true;
}
return false;
}
我收到消息:二进制运算符%
的操作数类型错误,第一种类型:T,第二种类型:int,其中T是类型变量。
我应该使用类型参数或布尔条件方法做什么,以便能够检查参数中的项是否可以被2除而没有左边,所以它是double / couple。
以及GreaterCondition类:
public class greaterCondition<T extends Number> extends Condition<T> {
private T border;
public (T border){
this.border = border;
}
@Override
public boolean condition(T item) {
return item > border;
}
}
此处NB不处理>
运算符。
感谢您的帮助!
答案 0 :(得分:1)
您的方法不安全,原因有二:
E
和T
之间没有关系;您可以传递一些完全不相关的类型的集合。? extends Whatever
的集合中,因为您不知道集合实际包含的类型(它可能只是其他某些子类的集合)。相反,您应该制作一个接受Collection<? super T>
的非泛型方法,该方法可以保证容纳T
(因为它是T
的集合或超类型) T
)。