簡體   English   中英

有沒有一種方法可以指定嵌套的泛型而不在Java 8+中兩次指定類型

[英]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時, ConcreteNodeAConcreteNodeB是可以用於ST的唯一類型。 而且,它可能不像您希望的那樣靈活。


我傾向於認為主要問題是您的參數過高。 如果您的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.

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