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

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

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

  1. import java.util.List;
  2. public class SimpleTest {
  3. abstract class AbsTask<T>
  4. {
  5. }
  6. abstract class AbsQueue<T extends AbsTask<?>>
  7. {
  8. private List<T> lst;
  9. public void addSpecialItem()
  10. {
  11. lst.add(new SpecialItem()); // Error occurs here
  12. }
  13. }
  14. class SpecialItem extends AbsTask<Void>
  15. {
  16. }
  17. }

我正在尝试向我的抽象类添加一个方法 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) 如果按以下方式键入“添加”行,则可以解决此错误:

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

有没有一种不用铸型的方法来处理这个问题 new SpecialItem()T ?

8ehkhllq

8ehkhllq1#

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

laik7k3q

laik7k3q2#

必须示例化抽象类来定义t是什么。试试这个:

  1. public class SimpleTest {
  2. static abstract class AbsTask<T> { }
  3. static class AbsQueue<T extends AbsTask<?>> {
  4. private List<T> lst;
  5. public void addSpecialItem(T item) {
  6. lst.add(item);
  7. }
  8. }
  9. static class Test {
  10. public void main() {
  11. AbsQueue<SpecialItem> queue = new AbsQueue<SpecialItem>();
  12. queue.addSpecialItem(new SpecialItem());
  13. }
  14. }
  15. static class SpecialItem extends AbsTask<String> {
  16. }
  17. }
展开查看全部
cwdobuhd

cwdobuhd3#

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

相关问题