自己参照ジェネリックをキャストできない理由がわかりません。
Java では、自己参照ジェネリックがあります。たくさんのもの( Intent
) と、それらのもの ( ) を検索 (解決) するための戦略がありResolutionStrategy
ます。
自己参照Intent
型は以下で定義されます。コンパイル時にResolutionStrategy
、同じ意図を受け入れる のみを受け取ることができるクラスを定義したいと考えています。
public interface Intent<I extends Intent<I, R>, R extends Resolution>
{
void resolve(ResolutionStrategy<I, R> strategy);
R getResolution();
}
したがって、解決戦略は次のとおりです。
public interface ResolutionStrategy<I extends Intent<I, R>, R extends Resolution>
{
R resolve(I intent);
}
したがって、これらの のリストを操作しているときは、Intent
それらが何であるかはあまり気にしません。ただし、ドメイン モデルで具体的なものを表す特定の型を作成したいと考えています。次に例を示します。
public class OrgIntent implements Intent<OrgIntent, IdentifiableResolution>
{
public final String name;
public OrgIntent(String name)
{
this.name = name;
}
@Override
public void resolve(ResolutionStrategy<OrgIntent, IdentifiableResolution> strategy)
{
// Do stuff
}
@Override
public IdentifiableResolution getResolution()
{
//Return resolution got from strategy at some point in the past
return null;
}
}
IdentifiableResolution
の単純で面白くない実装ですResolution
。
これまでのところすべて順調です。次に、これらの s の優れたグラフを作成し、Intent
それらを反復処理して、それぞれを a に渡して、ResolutionStrategyFactory
それらを解決するための関連する戦略を取得する計画です。ただし、OrgIntent
リストに追加するのに十分な一般的なものにキャストすることはできません!
private <I extends Intent<I, R>, R extends Resolution> DirectedAcyclicGraph<Intent<I, R>, DefaultEdge> buildGraph(Declaration declaration) throws CycleFoundException
{
DirectedAcyclicGraph<Intent<I, R>, DefaultEdge> dag = new DirectedAcyclicGraph<>(DefaultEdge.class);
// Does not compile
Intent<I, R> orgIntent = new OrgIntent("some name");
// Compiles, but then not a valid argument to dag.addVertex()
Intent<OrgIntent, IdentifiableResolution> orgIntent = new OrgIntent("some name");
// Compiles, but then not a valid argument to dag.addVertex()
OrgIntent orgIntent = new OrgIntent("some name");
//Then do this
dag.addVertex(orgIntent);
...
私が宣言すべきものはありorgIntent
ますか?
アップデート
@zapl のおかげで、メソッド定義のジェネリック型パラメーターが完全なニシンであることに気付きました。
これはコンパイルされますが、おそらくIntent
、最初のジェネリック型として古いナンセンスを持つようにジェネリック化された を何らかの形で持つことができることを意味しますか?
private DirectedAcyclicGraph<Intent<?, ? extends Resolution>, DefaultEdge> buildGraph(Declaration declaration) throws CycleFoundException
{
DirectedAcyclicGraph<Intent<?, ? extends Resolution>, DefaultEdge> dag = new DirectedAcyclicGraph<>(DefaultEdge.class);
OrgIntent orgIntent = new OrgIntent("some name");
dag.addVertex(orgIntent);