看一个GenricDaoImpl代码时候存在一个疑问:public class GenricDaoImpl<T extends Serializable, PK extends Serializable>
implements GenricDao<T, PK> { private Class<?> entityClass; // 实体类的类型 public GenricDaoImpl() {
entityClass = (Class<?>)((ParameterizedType) (this.getClass()
.getGenericSuperclass())).getActualTypeArguments()[0];
}
}
Type type = this.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType)type;
其中ParameterizedType接口是Type的子接口,Class类是Type实现类;但是Class类并没有实现ParameterizedType接口,强转为什么没有报错;Class类也没有重写getActualTypeArguments()方法;我自写了一个类似的Demo,报了com.itany.C cannot be cast to com.itany.B,代码如下:
interface A{}
interface B extends A{}
class C implements A{}
public class Main {
public static void main(String[] args) {
A a= new C();
B b=(B)a;
}
}

解决方案 »

  1.   


    恩?多态?关键是Class类 和ParameterizedType 接口之间并没有关系
      

  2.   


    恩?多态?关键是Class类 和ParameterizedType 接口之间并没有关系
    Type type = this.getClass().getGenericSuperclass();
    type是ParameterizedType的实现类ParameterizedTypeImpl不是Class....
      

  3.   


    恩?多态?关键是Class类 和ParameterizedType 接口之间并没有关系
    A类和B接口是没关系,但C类和A类有关系,也与B接口有关系,你的问题是把C类当作A类看了,所以才会纠结A与B的关系,但实际上并不是你想的那样,你那个方法得到的对象是C类型,虽然不知道具体什么类,但应该继承了A类,实现了B接口ABC你自己对号入座