在列表中添加通用对象

时间:2014-01-24 20:36:19

标签: java arrays list generics add

我有这些课

  • 概念
  • 链接,关系(扩展概念)
  • 概念
  • 链接,关系(应扩展概念)

类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);
    }
}

.... 我想(如果可能的话)使得无法将关系添加到链接或链接到关系

3 个答案:

答案 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());