看一個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;
}
}
uj5u.com熱心網友回復:
先看看多型。。。。

uj5u.com熱心網友回復:
恩?多型?
關鍵是Class類 和ParameterizedType 介面之間并沒有關系
uj5u.com熱心網友回復:
Type type = this.getClass().getGenericSuperclass();
type是ParameterizedType的實作類ParameterizedTypeImpl不是Class....
uj5u.com熱心網友回復:
先看看多型。。。。
恩?多型?
關鍵是Class類 和ParameterizedType 介面之間并沒有關系
A類和B介面是沒關系,但C類和A類有關系,也與B介面有關系,你的問題是把C類當作A類看了,所以才會糾結A與B的關系,但實際上并不是你想的那樣,你那個方法得到的物件是C型別,雖然不知道具體什么類,但應該繼承了A類,實作了B介面
ABC你自己對號入座
uj5u.com熱心網友回復:
先看看多型。。。。
恩?多型?
關鍵是Class類 和ParameterizedType 介面之間并沒有關系
A類和B介面是沒關系,但C類和A類有關系,也與B介面有關系,你的問題是把C類當作A類看了,所以才會糾結A與B的關系,但實際上并不是你想的那樣,你那個方法得到的物件是C型別,雖然不知道具體什么類,但應該繼承了A類,實作了B介面
ABC你自己對號入座
感謝!當時剛開始學習看不得仔細
uj5u.com熱心網友回復:
很多東西不能只看表面,回傳值是介面的實作類,這個實作類同時還實作了什么介面,你要查清楚,沒有規定回傳的介面實作類不能同時實作其它介面uj5u.com熱心網友回復:
臥槽。樓主,你連類的關系模型都沒弄明白,還是先別考慮泛型的問題了。泛型和繼承是兩個概念的東西。
implements 和 extends 也是有區別的。
樓主那個報錯,不是泛型的問題,是繼承的問題。
你的那個C類,沒有繼承B介面,只繼承了A介面,你將C強制轉換成B介面,肯定是要報錯的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58313.html
標籤:Java EE
