我搜索了堆栈溢出这个错误,但是没有一个设备和我有相同的设计。有关术语的建议,以帮助找到类似的主题,如下面的示例代码,将不胜感激。
这是一个演示错误的简单测试用例:
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
的情况下处理此问题?
答案 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
类型元素的列表,但您编写的代码并不能保证SpecialItem
是T
的子类型。
我们不清楚你真正想要什么,但我认为你想要的是List<AbsTask<?>>
,而不是某些具体的List<T>
<扩展T
的/ em> AbsTask<?>
。
答案 2 :(得分:0)
在该代码行lst.add(new SpecialItem());
,编译器还不知道T
是什么。