簡體   English   中英

如何克服訪問者實施的類型擦除問題

[英]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.

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