List <t>类型中的方法add(T)不适用于参数</t>

时间:2015-01-15 03:09:25

标签: java generics inheritance

我搜索了堆栈溢出这个错误,但是没有一个设备和我有相同的设计。有关术语的建议,以帮助找到类似的主题,如下面的示例代码,将不胜感激。

这是一个演示错误的简单测试用例:

import java.util.List;

public class SimpleTest {

    abstract class AbsTask<T>
    {

    }

    abstract class AbsQueue<T extends AbsTask<?>>
    {
        private List<T> lst;

        public void addSpecialItem()
        {
            lst.add(new SpecialItem()); // Error occurs here
        }



    }

    class SpecialItem extends AbsTask<Void>
    {

    }

}

我正在尝试向名为AbsQueue的抽象类addSpecialItem添加一个方法,该方法将SpecialItem类插入到列表通用列表T中,该列表基本上是AbsTask的列表。

以下是错误:The method add(T) in the type List<T> is not applicable for the arguments (SimpleTest.SpecialItem)

如果我输入添加行的大小写,我可以解决此错误,如下所示:

lst.add((T)new SpecialItem());

有没有办法在没有new SpecialItem()类型转换为T的情况下处理此问题?

3 个答案:

答案 0 :(得分:2)

必须实例化您的抽象类以定义T是什么。试试这个:

public class SimpleTest {

  static abstract class AbsTask<T> { }

  static class AbsQueue<T extends AbsTask<?>> {
    private List<T> lst;

    public void addSpecialItem(T item) {
      lst.add(item); 
    }
  }

  static class Test {

    public void main() {
      AbsQueue<SpecialItem> queue = new AbsQueue<SpecialItem>();
      queue.addSpecialItem(new SpecialItem());
    }
  }

  static class SpecialItem extends AbsTask<String> {

  }

}

答案 1 :(得分:0)

List<T> 假设是一个只能包含T类型元素的列表,但您编写的代码并不能保证SpecialItemT的子类型。

我们不清楚你真正想要什么,但我认为你想要的是List<AbsTask<?>>,而不是某些具体的List<T> <扩展T的/ em> AbsTask<?>

答案 2 :(得分:0)

在该代码行lst.add(new SpecialItem());,编译器还不知道T是什么。