[英]How can I make different captures of a wildcard compatible?
我正在嘗試使用一個類型參數class MyClass<E>
創建泛型類,它具有第二個泛型類的類變量,其中包含兩個類型參數SecondClass<V, E>
。 因為對於我的代碼而言, V
的類型無關緊要,我將該變量的類型聲明為SecondClass<?, E> var
。 在MyClass實現的某個時刻,我在var上調用一個返回V, public V foo(E e)
,然后將這個V類型的對象傳遞給另一個var, public int bar(V v)
。 然而,這並不編譯的,因為我的原因只是隱約知道,但我相信它在說明這里 。
顯然,捕獲了? foo返回的不同於捕獲的? 酒吧需要。 但為什么? 無論V的實際類型是什么,它對於兩種方法都必須相同,因為它們是在同一實例上調用的。 我在這里錯過了什么?
最后,我想知道的是:為了使代碼編譯,我需要更改什么,而不將V添加到MyClass的類型參數? (我不想強制MyClass的用戶指定V的類型,因為它應該無關緊要)
為了給你一個更具體的例子,這里是我正在研究的簡化版本。 正如您可能已經通過類型參數猜測的那樣,它涉及圖形。 MyClass
轉換為EdgePainter
, SecondClass
轉換為Graph
。 使用此代碼,編譯錯誤位於EdgePainter.getColor(E)
的第一行。
class Graph<V, E>
{
public V getTarget(E edge)
{
return null;
}
public int getInDegree(V vertex)
{
return 0;
}
}
class EdgePainter<E>
{
private static final Color COLOR_FOR_MANY_EDGES = Color.RED;
private static final Color COLOR_FOR_FEW_EDGES = Color.BLUE;
private Graph<?, E> graph;
public EdgePainter(Graph<?, E> aGraph)
{
graph = aGraph;
}
public Color getColor(E edge)
{
// My compiler says:
// The method getInDegree(capture#3-of ?) in the type
// Graph<capture#3-of ?,E> is not applicable for the arguments
// (capture#4-of ?)
int degree = graph.getInDegree(graph.getTarget(edge));
if (degree > 10)
return COLOR_FOR_MANY_EDGES;
else
return COLOR_FOR_FEW_EDGES;
}
}
您可以通過調用泛型方法捕獲通配符。
public Color getColor(E edge) {
return getColorInternal(graph, edge);
}
private <X> Color getColorInternal(Graph<X, E> g, E e) {
int degree = g.getInDegree(g.getTarget(e));
// ...
}
這是典型的情況。 您需要實現的類型參數,但希望將其隱藏在API用戶中。 如果許多方法受到影響,定義一個單獨的,可能是嵌套的類EdgePainterInternal
。 此內部實現具有第二個類型參數G
和公開可見的實現EdgePainter
將所有調用委托給EdgePainterInternal
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.