Zaczynam pracować z Javą po niektórych projektach w C# i C++.Jak pokonać problem z typem wymazania dla implementacji gościa
chciałem projektować interfejsy gości tak:
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> //....
{
}
Oczywiście to nie działa, ponieważ typu skasowaniem. (Powodem, dlaczego chcę coś takiego jest, że będę mieć różne interfejsy odwiedzających dla różnych grup działania, które można zwiedzać.)
Jedynym rozwiązaniem, które przychodzi mi na myśl to zadeklarować interfejsów
public interface ActionAVisitor {
void visitAction(ActionA action);
}
public interface ActionBVisitor {
void visitAction(ActionB action);
}
//...
a następnie
public interface MySmallActionVisitor
extends ActionAVisitor, ActionBVisitor
{
}
to będzie działać, ale nie chciałbym deklarację wszystkich ActionXVisitor interfejsy, które jest głupie powtórzeń i wiele plików ...
Czy masz jakieś pomysły, jak to zrobić lepiej?
Wielkie dzięki!
Masz na myśli użycie "instanceof"? Właśnie tego wzór odwiedzający chce uniknąć. Ponadto musiałbym napisać je, jeśli bloki w każdym odwiedzającym (MySmallVisitor, MyFullVisitor i inne). – Philipp
tak, miałem na myśli instanceof. próba uniknięcia tego, prawdopodobnie doprowadzi w końcu do znacznie większej ilości kodu. –
jeśli naprawdę nie ma sposobu na przezwyciężenie problemu, który opisałem, wolałbym mieć więcej kodu niż kodu instancji ... Słaby język :-( – Philipp