簡體   English   中英

是否可以做“上課” <? extends foo> foo”?

[英]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;

但是,如果您對類足夠了解,並有理由擁有該類型的變量,則可能不會問這個問題。 通常我們想要一個FooBar實例

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中聲明您的方法(最好作為抽象方法),並在BarBaz重寫它會更好。

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM