[英]Is there a way of specifying a nested generic without specifying a type twice in Java 8+
給出以下示例...
S表示ConcreteType A的起始節點
T表示混凝土類型B的末端節點
E表示以S為起點,T為終點的邊
EdgeSet具有一組通過接口方法訪問的Edge
SomeObject通過方法SomeObject.getEdges()返回EdgeSet接口。
使用泛型定義的類定義如下...
public class EdgeSet<S extends Node, T extends Node, E extends Edge<S, T>> { ... }
public class SomeObject {
protected EdgeSet<ConcreteNodeA, ConcreteNodeB, ConcreteEdge<ConcreteNodeA, ConcreteNodeB>> someEdgeSet;
...
public EdgeSet<? extends ConcreteNodeA, ? extends ConcreteNodeB, ? extends ConcreteEdge<? extends ConcreteNodeA, ? extends ConcreteNodeB>> getEdges() {
//returns someEdgeSet...
}
}
使用示例...
EdgeSet<? extends ConcreteNodeA, ? extends ConcreteNodeB, ? extends ConcreteEdge<? extends ConcreteNodeA, ? extends ConcreteNodeB>> exampleEdgeSet = o.getEdges();
有什么方法可以定義此代碼,以及使用成員方法而不定義兩次的代碼?
例如:
public class EdgeSet<E extends Edge<S extends Node, T extends Node>> { ... }
EdgeSet<ConcreteEdge<? extends ConcreteNodeA, ? extends ConcreteNodeB>>
protected EdgeSet<ConcreteEdge<ConcreteNodeA, ConcreteNodeB>>
如果不是,是否可以通過RFC減少冗余信息?
有什么方法可以定義此代碼,以及使用成員方法而不定義兩次的代碼?
給定您當前定義的EdgeSet
,我看到的唯一替代方法是使用非通用的Edge
實現:
public class ConcreteEdgeAB extends Edge<ConcreteNodeA, ConcreteNodeB> {
// ...
}
然后,您可以編寫如下聲明
protected EdgeSet<ConcreteNodeA, ConcreteNodeB, ConcreteEdgeAB> someEdgeSet;
但是,這仍然有些冗余,因為當將ConcreteEdgeAB
用作E
時, ConcreteNodeA
和ConcreteNodeB
是可以用於S
和T
的唯一類型。 而且,它可能不像您希望的那樣靈活。
我傾向於認為主要問題是您的參數過高。 如果您的Edge
類型本身是通過其末端的節點類型進行參數化的,那么在節點類型上同時對一組邊緣進行參數化在本質上也是多余的- 邊緣集僅需要在其包含的邊緣類型上進行參數化:
interface Edge<S extends Node, T extends Node> {
}
// The bounds on the type parameters of Edge effectively apply here, too:
public class EdgeSet <E extends Edge<?, ?>> {
// ...
}
public class SomeObject {
protected EdgeSet<ConcreteEdge<ConcreteNodeA, ConcreteNodeB>> someEdgeSet;
...
public EdgeSet<? extends ConcreteEdge<? extends ConcreteNodeA, ? extends ConcreteNodeB>> getEdges() {
return someEdgeSet;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.