Java boolean addAll方法和泛型类型参数问题

时间:2018-07-24 20:17:15

标签: java generics

我目前正在学习泛型,并且我有一个任务,必须制作一个带有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不处理>运算符。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的方法不安全,原因有二:

  1. ET之间没有关系;您可以传递一些完全不相关的类型的集合。
  2. 您可以将内容添加到? extends Whatever的集合中,因为您不知道集合实际包含的类型(它可能只是其他某些子类的集合)。

相反,您应该制作一个接受Collection<? super T>的非泛型方法,该方法可以保证容纳T(因为它是T的集合或超类型) T)。