簡體   English   中英

如何對兼容的通配符進行不同的捕獲?

[英]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轉換為EdgePainterSecondClass轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM