类型列表< t>中的add(t)方法不适用于参数

66bbxpm5  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(401)

我在堆栈溢出中搜索这个错误,但是没有一个和我的设计完全相同。建议的术语,以帮助找到一个类似的主题,如下面的样本代码将不胜感激。
下面是一个简单的测试用例,演示了错误:

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类插入到list generic list 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 ?

8ehkhllq

8ehkhllq1#

List<T> 应该是只能包含类型为的元素的列表 T ,但您编写的代码不能确保 SpecialItem 是的子类型 T .
不清楚你到底想要什么,但我认为你想要的是 List<AbsTask<?>> ,不是 List<T> 对于某些特定的 T 延伸 AbsTask<?> .

laik7k3q

laik7k3q2#

必须示例化抽象类来定义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> {

  }

}
cwdobuhd

cwdobuhd3#

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

相关问题