[英]How can I refer to the type of the current class?
這有點難以解釋,但我到處都看,我找不到任何好的答案。
我也看過Stack Overflow問題如何引用接口在Java中實現的類類型? 如何返回與使用Java 6傳入的類相同類型的對象的實例? ,但他們無法回答我的問題。 應用繼承時有一個例外。
有一個例子,讓它更容易理解:
假設我有一些名為SelfMaker的界面:
public interface SelfMaker <SELF>{
public SELF getSelf();
}
A有一只狗,可以與另一只狗生育。 所以狗是一個“SelfMaker”,像這樣:
public class Dog implements SelfMaker<Dog> {
String color;
public String toString() {
return "some " + color + " dog";
}
public Dog procreate(Dog anotherDog) {
Dog son = getSelf();
son.color = color;
return son;
}
@Override
public Dog getSelf() {
return new Dog();
}
}
但是,我有一只國內狗,他是一只狗,但它有一個可愛的家庭,他給他起了個名字。 像這樣:
public class DomesticDog extends Dog {
private String name;
public String toString() {
return super.toString() + " named " + name;
}
}
現在,我有一些課程處理“SelfMaker”的事情,讓我們把這個課稱為“情侶”。 像這樣:
public class Couple<T extends SelfMaker<T>> {
private T first;
private T second;
public String toString() {
return first.toString() + " and " + second.toString();
}
}
除外:
當我想創建一些DomesticDog
時會出現異常。 像這樣:
public class CoupleOfDomesticDogs extends Couple<DomesticDog>{
public DomesticDog procreate(){
DomesticDog son = first.procreate(second);
return son;
}
}
這將在<DomesticDog>
上引發異常抱怨: Bound mismatch: The type DomesticDog is not a valid substitute for the bounded parameter <T extends SelfMaker<T>> of the type Couple<T>
我已經嘗試將類中的通用變量更改為: Couple<T extends SelfMaker<?>>
但是“son”不是DomesticDog(我希望“son”成為DomesticDog)。 如果我添加一些演員,那么它將編譯,但它將不太清晰。
所以...這里有一個問題:有沒有辦法在沒有鑄造和概括的情況下實現這一目標?
沒有鑄造,我無法想到這樣做。 如果覆蓋DomesticDog的procreate和getSelf方法並更改類Couple的聲明,則問題將解決:
public class DomesticDog extends Dog {
private String name;
public DomesticDog procreate(Dog anotherDog) {
return (DomesticDog)super.procreate(anotherDog);
}
public Dog getSelf() {
return new DomesticDog();
}
public String toString() {
return super.toString() + " named " + name;
}
}
public class Couple<T extends SelfMaker<? super T>> {
protected T first;
protected T second;
public String toString() {
return first.toString() + " and " + second.toString();
}
}
如果你不想在Dog的每個子類中覆蓋getSelf(),你可以在類Dog中進行以下更改:
public Dog getSelf() {
Class<? extends Dog> thisClass = this.getClass();
try {
return thisClass.newInstance();
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
throw new UnsupportedOperationException(thisClass
+ " does not supply a public no-arg constructor");
}
這保證)由getSelf(返回的每個值的一個實例this.getClass()
但是你仍然需要為子類強制轉換procreate()的返回值。 無法將返回類型顯式指定為this.getClass()
。
你必須使用Dog
通用和抽象,使用一個類型參數來指示getSelf()
的結果。 然后,每種類型的Dog
都需要將它們作為參數實現:
public abstract class Dog<T> implements SelfMaker<T> {
String color;
public String toString() {
return "some " + color + " dog";
}
public T procreate(T anotherDog) {
T son = getSelf();
son.color = color;
return son;
}
}
public class DomesticDog extends Dog<DomesticDog> {
private String name;
public String toString() {
return super.toString() + " named " + name;
}
@Override
public DomesticDog getSelf() {
return new DomesticDog();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.