Chciałbym wykonać kilka operacji na podstawie typu obiektu i bez użycia instanceof
. Najpierw myślałem o przeciążeniu metod opartych na typach (jak widać poniżej) i pomyślałem, że być może Java wybrałaby metodę odpowiednio (w oparciu o najbardziej specyficzną klasę obiektu). tamUstaw Java jako najbardziej specyficzny typ przy wyborze metody spośród przeciążonych metod.
A
B
C
Object
- jest sposobem, aby wybrać metodę Java w oparciu o najbardziej:
import java.util.ArrayList; import java.util.List; public class TestA { public static void main(String[] args) { List<Object> list = new ArrayList(); list.add(new A()); list.add(new B()); list.add(new C()); list.add(new Object()); TestA tester = new TestA(); for(Object o: list) { tester.print(o); } } private void print(A o) { System.out.println("A"); } private void print(B o) { System.out.println("B"); } private void print(C o) { System.out.println("C"); } private void print(Object o) { System.out.println("Object"); } } class A { } class B extends A { } class C { }
Wyjście jest:
Object Object Object Object
Jednak wyjście Jestem Po określony typ obiektu parametru?
- Jeśli nie, jakie alternatywy mogę patrzeć na taką funkcjonalność, bez pomocy
instanceof
- I faktycznie próbuje symulować wzór odwiedzających jednak wydaje się, co sprawia, że praca odwiedzający jest ze względu na podwójną wysyłką , który sprawia, że parametr "akceptowany" jest we właściwym typie podczas wywołania funkcji, w szczególności
visitor.accept(this)
wclass A
powoduje wywołanie funkcjivisitor.accept(A o)
. - Szczerze mówiąc, nie zgadzam się z
instanceof
, ponieważ przeczytałem, że jest to zła praktyka; w takim przypadku czy nadal byłaby to zła praktyka?
Czy twoja klasa 'C' nie rozszerza' B' lub 'A'? –
@RohitJain Nope. Chodzi o to, że C to zupełnie inna klasa. – Chad
Wtedy obawiam się, że nie możesz tego zrobić bez sprawdzenia "instanceof" i odpowiedniego rzucania. Mimo to pozwól mi jeszcze raz spojrzeć na twój kod. –