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?