[英]Is it possible to do “Class<? extends foo> foo”?
我有這樣的等級制度:
class Foo {
...
}
class Bar extends Foo {
...
}
class Baz extends Foo {
...
}
現在,我試圖在foo類中聲明一個這樣的對象:
Class<? extends Foo> anyName;
然后有一些方法我想這樣做:
anyName = new Foo();
但這不會讓我那樣做。 誰能幫我嗎?
我已經閱讀了一些有關泛型和通配符的指南/教程/文檔。 但是我還沒有完全解決這個問題。
編輯:固定大寫。 抱歉,這是輸入錯誤。 我原來的課程確實是這樣。
EDIT2:這里的目標是獲取Foo的單例實例。
EDIT3:非常抱歉,現在應該是正確的! 真可惜:/
Class<Foo>
與Foo
類型不兼容。
Class<Foo> c = new Foo();
……因此無法工作。
如果要使用Class
類型的對象,通常的方法是使用類名,后跟.class
:
Class<Foo> c = Foo.class
您可以使此句柄子類如下:
Class<? extends Foo> c = Bar.class;
但是,如果您對類足夠了解,並有理由擁有該類型的變量,則可能不會問這個問題。 通常我們想要一個Foo
或Bar
的實例 :
Foo a = new Foo();
Bar b = new Bar();
Foo c = new Bar(); // type compatible because of inheritance
您提到要調用方法和/或強制轉換變量。
你可以做:
Foo a = ...;
if(a instanceof Bar) {
Bar b = (Bar) a;
b.someMethodOfBar();
}
但是,casting和instanceof
都是“代碼氣味”-不一定是錯誤的,但是有證據表明可以更好地設計某些東西。
如果在Foo
中聲明您的方法(最好作為抽象方法),並在Bar
和Baz
重寫它會更好。
Foo a = ...;
a.someMethod(); // if it's a Bar, this is Bar.someMethod()
// if it's a Baz, this is Baz.someMethod()
這稱為多態 ,是OO編程中最重要的概念之一。
我不確定您要從這里得到什么,但是我的建議太長了,無法發表評論。
您想要實現的是獲取一個作為Foo
實例的變量,因此您可以執行anyName = new Foo()
。 但是您也希望能夠做到這一點anyName = new Bar();
或this anyName = new Baz();
。
如果我在這里,則無需使用泛型。 相反,您只需要定義anyName
,如下所示:
Foo anyName;
根據評論更新
您無法獲得未知對象的實例。 我會使用以下方法之一:
您可以將變量強制轉換為所需的時間。 例如:
((Bar) anyName).someBarMethod();
另外,您可以創建一個通用方法來獲取所需的類型。 當您在投射時需要一些靈活性時,這很有用:
public <T extends Foo> T getFoo(Class<T> type){
return (T) anyName;
}
您可以使用反射API創建任何Class<? extends Foo> anyName
的新實例Class<? extends Foo> anyName
Class<? extends Foo> anyName
通過使用anyName.getDeclaredConstructor().newInstance()
這是一個詳細的示例: https : //docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.