我目前正在学习泛型,我得到了一个任务,我必须创建一个带有T类型参数的数组类,以及一个数组数据成员和一些方法(setItem,getItem,visitor,condition和addAll)。我对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不接受add方法中的e
。我搞不懂为什么…。如果我在方法(public boolean addAll(集合<? extends T>
c){})中使用T类型参数而不是E,情况是一样的。我得到了不兼容类型的消息:E不能转换为CAP#1,其中E是类型变量,而CAP#1是新的类型变量。我做错了什么?
我的第二个问题是Array类使用了一个抽象的Condition类,它有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整除而不是左除,所以它是双精度/双精度的。
和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不处理>
运算符。
任何一点的帮助都是非常感谢的!
发布于 2018-07-25 04:21:47
您的方法不是类型安全的,原因有两个:
E
和T
之间没有关系;您可以传递某个完全不相关类型的集合。? extends Whatever
的集合添加内容,因为您不知道该集合实际包含什么类型(它可能只是某个其他子类的集合)。相反,您应该创建一个接受Collection<? super T>
的非泛型方法,该方法可以保证能够保存T
(因为它是T
的集合或T
的超类型)。
https://stackoverflow.com/questions/51506888
复制相似问题