この状況でジェネリック型を使用する正しい方法は何ですか?次のコードを検討してください。
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);
}
}
}
}
コンパイラーは、変数xを定義する場合を除いて、使用するたびにジェネリック型Tについて不平を言っています:境界の不一致:タイプTは、境界パラメーター<T extends Comparable <?タイプGTreeのスーパーT >>。NodeEntry
問題はNodeEntryは、特に型であるクラスを探しているということであるT
ことextends Comparable
が、GTreeクラスは、これがバインドされていません。これを解決するには、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
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加