私はC#とC++のいくつかのプロジェクトの後でJavaを使い始めています。 訪問者の実装のための型消去の問題を解決するには
は、私はこのような訪問者のインターフェースを設計したかった:public interface ActionVisitor<A> {
void visitAction(A action);
}
public interface MySmallActionVisitor
extends ActionVisitor<ActionA>,
ActionVisitor<ActionB>
{
}
public interface MyFullActionVisitor
extends ActionVisitor<ActionA>,
ActionVisitor<ActionB>,ActionVisitor<ActionC>,ActionVisitor<ActionD> //....
{
}
もちろんこれが原因型消去の動作しません。 (私はこのような何かをしたい理由は、私が訪問することができますアクションのグループごとに異なるビジターインタフェースを持っているということです。)
私の心に来る唯一の解決策は、インターフェース
public interface ActionAVisitor {
void visitAction(ActionA action);
}
public interface ActionBVisitor {
void visitAction(ActionB action);
}
//...
を宣言することです
その後、
public interface MySmallActionVisitor
extends ActionAVisitor, ActionBVisitor
{
}
...これは動作しますが、私は愚かな繰り返しやファイルがたくさんあるすべてActionXVisitor-インタフェースの宣言を好きではないだろう210
これをより良くする方法はありますか?
ありがとうございます!
"instanceof"を使用することを意味しますか?それはビジターパターンが避けたいものです。さらに、すべての訪問者(MySmallVisitor、MyFullVisitorなど)にブロックがある場合は、これらを記述する必要があります。 – Philipp
はい、私はinstanceofを意味しました。それを回避しようとすると、最終的にはるかに多くのコードにつながる可能性があります。 –
私が説明した問題を克服する方法が本当にない場合は、instanceofコードよりもコードがたくさんあると思います...悪い言語:-( – Philipp