[英]Java - Using Generics Types
在這種情況下使用泛型類型的正確方法是什么? 考慮以下代碼:
public class GTree<T> {
private int level;
private T value;
private String key;
private LinkedList<GTree<T>> subTrees;
private GTree<T> parent;
public class NodeEntry<T extends Comparable<? super T>> implements Comparable<T>{
private T value;
private String key;
public NodeEntry(T v, String k) {
this.value = v;
this.key = k;
}
public T getValue() {
return value;
}
public String getKey() {
return key;
}
public int compareTo(T o) {
return getValue().compareTo(o);
}
public int compareTo(GTree<T>.NodeEntry<T> o) {
// TODO Auto-generated method stub
return value.compareTo(o.getValue());
}
}
private void getAllBranches(LinkedList<LinkedList<NodeEntry<T>>> path)
{
if(leaf())
{
LinkedList<NodeEntry<T>> lastPath = path.getLast();
NodeEntry<T> p = new NodeEntry<T>(value, key);
lastPath.addLast(p);
return;
}
else
{
LinkedList<NodeEntry<T>> lastPath = path.getLast();
NodeEntry<T> p = new NodeEntry<T>(value, key);
lastPath.addLast(p);
....
for(int i = 0; i < subTrees.size(); i++)
{
T x = subTrees.get(i).getValue();
if(subTrees.get(i).leaf())
{
lastPath.addLast(new NodeEntry<T>(subTrees.get(i).getValue(), subTrees.get(i).getKey()));
....
}
else
subTrees.get(i).getAllBranches(path);
}
}
}
}
每當我使用泛型類型 T 時,編譯器都會抱怨它,除非我定義了變量 x:綁定不匹配:類型 T 不是有界參數 <T extends Comparable<? GTree 類型的 super T>>。 節點入口
問題是 NodeEntry 專門尋找一個類型為T
的 class extends Comparable
但 GTree class 沒有此限制。 要解決此問題,您必須從 NodeEntry 中刪除綁定要求,以從 GTree 定義類型參數 T ,其上限為T extends Comparable
。
如果 NodeEntry 需要與 GTree 相同的值,那么在這種特定情況下,GTree 的類型參數 T 應該綁定到 Comparable。
public static class GTree<T extends Comparable<T>> {
private int level;
private T value;
private String key;
private LinkedList<GTree<T>> subTrees;
private GTree<T> parent;
public static class NodeEntry<T extends Comparable<T>> implements Comparable<T> {
private T value;
private String key;
public NodeEntry(T v, String k) {
this.value = v;
this.key = k;
}
public T getValue() {
return value;
}
public String getKey() {
return key;
}
@Override
public int compareTo(T o) {
return value.compareTo(o);
}
}
private void getAllBranches(LinkedList<LinkedList<NodeEntry<T>>> path) {
// more
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.