【问题标题】:Adding generic object inside a list在列表中添加通用对象
【发布时间】:2014-01-24 20:36:19
【问题描述】:

我有这些课

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

Concepts 类应该有一个

private List<? extends Concept> list; //or something similar
addConcept(Concept c); // that should work with a (Link) for the class Links

但这并不像我尝试的那样工作......而且从互联网搜索,它看起来不像它可以工作。如何为链接和关系创建一个超类,包括将概念插入某种内存持有者。

这...不起作用

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

.... 我希望(如果可能)无法将关系添加到链接或链接到关系

【问题讨论】:

    标签: java arrays list generics add


    【解决方案1】:

    你无法完成你想做的事情。您一定想知道为什么不能将Concept 类型的东西添加到List&lt;? extends Concept&gt;。原因如下:

    考虑这种情况:

    List<? extends Concept> list = new List<Link>();
    

    除了Link之外,您还有另一个类也扩展了Concept,我们称之为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> {
    }
    

    【讨论】:

      【解决方案2】:

      我对泛型的建议:

      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> {
      }
      

      在这种情况下,下面的代码无法编译,因此您无法将关系添加到链接:

      new Links().add(new Relation());
      

      【讨论】:

        【解决方案3】:

        如果我的理解正确的话,Link 也是一个 Concept(扩展了 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);
            }
        }
        

        希望对你有帮助

        【讨论】:

        • 这不能满足我的需要。我想让不可能将错误的概念添加到列表中。例如,没有关联中的链接,也没有关联中的关联。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多