2014-01-24 40 views
0

我有這些類添加通用對象列表裏面

  • 概念
  • 鏈接,關係(延伸概念)
  • 概念
  • 鏈接,關係(應該延伸概念)

該類概念應該有一個

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

.... 我想(如果可能),使其不能添加到關係或鏈接鏈接到關係

回答

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

在這種情況下,代碼波紋管不會編譯,所以你不能添加有關鏈接:

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

如果我有正確認識你,一個鏈接也是一個概念(延伸概念),所以你可以使用一個列表來存儲Link和概念的對象,像這樣的代碼:

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

希望它可以幫助

+0

這不符合我的需要。我想讓不可能將錯誤的概念添加到列表中。例如,沒有鏈接關係和鏈接沒有關係。 – user1106844

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