簡體   English   中英

我怎樣才能引用當前類的類型?

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

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