首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java布尔addAll方法和泛型类型参数问题

Java布尔addAll方法和泛型类型参数问题
EN

Stack Overflow用户
提问于 2018-07-25 04:17:15
回答 1查看 208关注 0票数 0

我目前正在学习泛型,我得到了一个任务,我必须创建一个带有T类型参数的数组类,以及一个数组数据成员和一些方法(setItem,getItem,visitor,condition和addAll)。我对addAll方法有问题:

代码语言:javascript
复制
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>,但没有更改:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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不处理>运算符。

任何一点的帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-25 04:21:47

您的方法不是类型安全的,原因有两个:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51506888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档