我有这些课
类Concepts应该有
private List<? extends Concept> list; //or something similar
addConcept(Concept c); // that should work with a (Link) for the class Links
但这并不像我尝试的方式那样有效......而且从搜索互联网来看,它看起来并不像是可行的。如何为链接和关系创建一个超类,其中包括将Concept插入某种内存持有者。
这......不起作用
public class Concepts{
protected List<? extends Concept> list = null;
Concepts(String text) {
}
public void add(Concept test) {
list.add(test);
}
}
public class Links extends Concepts{
Links() {
list = new List<Link>();
}
public void add(Link test) {
list.add(test);
}
}
.... 我想(如果可能的话)使得无法将关系添加到链接或链接到关系
答案 0 :(得分:2)
你无法完成你想要做的事情。您一定想知道为什么不能将Concept
类型的内容添加到List<? extends Concept>
。原因如下:
考虑这种情况:
List<? extends Concept> list = new List<Link>();
除了Concept
之外,您还有另一个类Link
,我们称之为Link2
:
public class Link2 extends Concept { ... }
然后问题就出现了。如果你这样做了:
Link2 myLink2 = new Link2();
list.add(myLink2);// Big problem, remember that your list was instantiated as a list of Links not Link2s.
这就是为什么你不能将项添加到这样的通配符类型列表中的原因,因为你可能会尝试向它添加一些内容,而这些内容根本不适用于它被实例化的列表类型。
现在,我建议你做什么。使您的基类具有通用性,然后您的扩展类只需指定它将处理的具体类型。像这样:
public class Concepts<T extends Concept> {
private List<T> list = new List<T>();
public void add(T test) {
list.add(test);
}
}
public class Links extends Concepts<Link> {
}
答案 1 :(得分:0)
如果我理解正确,Link也是一个Concept(extends Concept),因此您可以使用List来存储Link和Concept对象,如下代码所示:
public class Concept{
Concept(String text) {
}
}
public class Link extends Concept{
Link(String text) {
super(text);
}
}
import java.util.List;
public class Concepts{
protected List<Concept> list = null;
Concepts(String text) {
}
public void add(Concept test) {
list.add(test);
}
}
public class Links extends Concepts{
Links(String text) {
super(text);
}
public void add(Link test) {
list.add(test);
}
}
希望有所帮助
答案 2 :(得分:0)
我对泛型的提议:
public class AbstractConcepts<T extends Concept> {
private List<T> list = new ArrayList<>();
public void add(T test) {
list.add(test);
}
}
public class Concepts extends AbstractConcepts<Concept> {
Concepts(String text) {
}
}
public class Links extends AbstractConcepts<Link> {
}
在这种情况下,代码bellow不会编译,因此您无法将Links添加到Links:
new Links().add(new Relation());