私は、いとこが非常に似た機能を共有するクラス階層を持っています。たとえば:有界型へのキャスト
Node
Statement
FunctionCallStatement
Expression
FunctionCallExpression
FunctionCallStatementとFunctionCallExpressionは非常によく似たAPIを共有し、私は、単一継承階層を持つ純粋なクラスの用語ではそれを表現することはできません。だから、これらの両方が実装されているIsFunctionCallインターフェイスを作成しました。このすべてが非常にうまく動作
void <T extends Node & IsFunctionCall> doSomething(T node) { ... }
:私は今、次のようにFunctionCallStatementまたはFunctionCallExpressionのいずれかを受け取るメソッドを宣言することができます。
残念ながら、私は今、かなり面倒な問題に直面しています。私はノードを持っています。私はそれが動的であることを知っていますはFunctionCallStatementかFunctionCallExpressionのいずれかでなければなりません。私はそのNodeを上記のdoSomething()
メソッドに渡す必要があります。私はそれを適切なタイプにアップキャストする方法を見つけることができません。
今はinstanceofのチェーンを使用してNodeがどのクラスであるかを判断し、それを適切な具体的な型にキャストしていますが、それはbutt-uglyです。私がこの作業をするために知っている他の唯一の方法は、IsNodeインターフェイスを作成し、現在ノードがIsNodeを期待していることをすべて期待することです。これにより、IsNodeとIsFunctionCallを実装した共用体インタフェースを宣言し、上記のジェネリックスを使わずに済ませることができます。しかし、それはたくさんの仕事の地獄であり、まだかなり醜いです。
これを行う別の方法はありますか?
(注:上記の例では、私の実際のコードの簡略版である)更新
:次いで
@SuppressWarnings("unchecked")
private <S extends Node & IsFunctionCall> S castNode(Node node)
{
return (S) node;
}
と:
doSomething(castNode(node));
私は悪の次のピースを試し
非常に奇妙なエラーメッセージがあります。 castNode()
のSを決定するために使用される型推論は、doSomething()
の宣言でTと一致しないように見えます。具体的な型だけを使用し、SをNodeに設定しています。どちらが当然doSomething()
の宣言型と一致しません。非常に独特です。
更新更新:
これはHow should I cast for Java generic with multiple bounds?の近くに重複して表示されます。境界にはオブジェクトとインタフェースが含まれているため、私の状況は少し異なりますが、もう一方の質問には2つのインタフェースがありますが、それでも適用できます。
私はアプリケーション全体を再設計して再構築する必要があるようです。一口。
管理者は、これを複製として閉じることができます...
[どのように私は、複数の境界を持つ一般的なJava用キャストする必要がありますか?]の可能な重複は(http://stackoverflow.com/questions/318208/how-should-i-cast-for-java-generic-with -nultiple-bounds) –