2015-05-15 6 views
2

Я хотел бы реализовало эту иерархию наследования: Generic распространяется на Insurance ведьмы содержит внутренний (не статические) Класс HouseInsuranceНаследования класса модели с родовыми и внутренними классами

Generic класс быть продлен

public abstract class Generic<T extends Generic> { 
    public Generic() { 
     entityClass = ((Class) ((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0])); 
    } 
} 

класса, которые проходят общие и вложенные класс, которые проходят Outer (вшита) класс Insurance

public class Insurance extends Generic<Insurance> { 
    public class HouseInsurance extends Insurance { 
    } 
} 

К сожалению, когда я пытаюсь создать экземпляр внутреннего класса я получаю сообщение об ошибке:

ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 

Я полагаю, что я должен добавить к внутренней декларации класса типа параметра. Но я не знаю как.

Общий класс расширен многими другими классами, и он работает. Это первое наследование с внутренним классом, поэтому я думаю, что есть проблема.

Пожалуйста, помогите. До сих пор я получаю только ошибку компиляции.

+0

Как вы пытаетесь создать экземпляр? –

+0

HouseInsurance houseInsurance = Insurance.new HouseInsurance(); – masterdany88

+0

В этом случае следует указать точку в списке объектов classClass? Страховой класс или класс HouseInsurance? –

ответ

1

Я не уверен, что когда вы создаете экземпляр класса HouseInsurance, класс которого должен entityClass обратитесь к? Таким образом, давая оба решения:

Если entityClass должен указывать на HouseInsurance класса, чем использовать этот код:

public Generic() { 
    Type genericType = getClass().getGenericSuperclass(); 
    if (genericType instanceof ParameterizedType) { 
     entityClass = ((Class) ((Class) ((ParameterizedType) genericType).getActualTypeArguments()[0])); 
    } 
    else { 
     entityClass = getClass().getSuperclass(); 
    } 
} 

И если entityClass следует указать на Insurance класса, чем использовать вместо этого:

public Generic() { 
    Class cClass = getClass(); 
    do { 
     Type genericType = cClass.getGenericSuperclass(); 

     if (genericType instanceof ParameterizedType) { 
      entityClass = ((Class) ((Class) ((ParameterizedType) genericType).getActualTypeArguments()[0])); 
     } 
     else { 
      cClass = cClass.getSuperclass(); 
     } 
    } while (entityClass == null); 
} 
+0

Это сработало. Благодарю. – masterdany88

+0

Рад, что это сработало. –

2

Для всех из этих видов сценариев, выписка TypeTools:

public Generic() { 
    entityClass = TypeResolver.resolveRawClass(Generic.class, getClass()); 
} 
+0

Спасибо. Я проведу это решение в свободное время – masterdany88