[英]How to overcome problem with type erasure for visitor implementation
在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> //....
{
}
當然,由於類型擦除,這不起作用。 (我想要這樣的東西的原因是我將為可以訪問的不同Actions組設置不同的Visitor接口。)
我想到的唯一解決方案是聲明接口
public interface ActionAVisitor {
void visitAction(ActionA action);
}
public interface ActionBVisitor {
void visitAction(ActionB action);
}
//...
接着
public interface MySmallActionVisitor
extends ActionAVisitor, ActionBVisitor
{
}
這可行,但我不想聲明所有的ActionXVisitor接口,這是愚蠢的重復和大量的文件......
你有什么想法如何更好地做到這一點?
非常感謝!
我使用Java中的大型復雜庫,它以非常干凈和整潔的方式廣泛使用訪問者模式。 特別是,我遇到了類型擦除的相同問題,現在已經解決了。
如果你有機會,請看一篇我寫過的文章 。
這是一篇很長的文章,詳細解釋了訪問者模式在概念上的含義,在本文的最后部分,討論了涉及多態性和類型擦除的現實生活示例。
干杯
我會使用一個未參數化的訪問者界面,然后在訪問者方法內部根據類型進行調度。
沒有辦法能夠避免方法內部的instanceof。 但你可以使它更優雅:
public interface MarkerInterface{}
public interface ActionVisitor<T extends MarkerInterface> {
void visitAction(T action);}
public class A implements MarkerInterface{}
public class B implements MarkerInterface{}
public class MySmallActionVisitor implements ActionVisitor<MarkerInterface>{
@Override
public void visitAction(MarkerInterface action) {
if(action instanceof A){
}
else if(action instanceof B){
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.