Hej,
Piszę projekt na zaliczenie, który buduję (korzystając z refleksji) HashMapę z metodami na podstawie klas parametru.
Mam też kilka funkcji które przyjmują jako parametr typy generyczne
(np. PrimaryExpression<IntegerLiteral>, PrimaryExpression<StringLiteral>, ...)
Metoda invoke(Object obj) szuka takiej metody której parametr jest zgodny z klasą obj.
Niestety mając metody:
@AstCallMe
public void expressionLiteralString(PrimaryExpression<StringLiteral> expr);
@AstCallMe
public void expressionLiteralInteger(PrimaryExpression<IntegerLiteral> expr);
Oraz obiekt PrimaryExpression<StringLiteral> porównując tylko klasy okazuję się że obie metody mogą zostać wywołane - co później czasami może skończyć się wyjątkiem ClassCastException.
W projekcie ten problem rozwiązałem tworząc dodatkowe klasy (na szczęście było ich mało) które dziedziczą po nich - np.
StrLitExpression extends PrimaryExpression<StringLiteral>
Udało mi się częściowo napisać program który rozwiązuje problem http://szara.chmurka.net/Test.java
Ale wymaga aby każda generyczna klasa implementowała interfejs GenericType.
W isArgOk()
return argType.equals(objType);
- demonstruję problem - rzuca wyjątek:
Wyjatek w: acceptInt() inner: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
return argType.equals(objType) && isGenericTypeOk(m, obj);
- częsciowo rozwiązuje problem ale dalej pozostaję problem z klasami typu Foo<? extends smth>
Fajnie by było pozbyć się interfejsu GenericType, oraz dorobić obsługę <? extends Smth>
Ma ktoś jakieś pomysły?