簡體   English   中英

使用泛型在抽象類中實現常用方法

[英]Using generics to implement a common method in an abstract class

假設我有這種層次結構:

public abstract class AbstractEntity implements Cloneable {
    ...
    public AbstractEntity clone() {
        Cloner cloner = new Cloner();
        AbstractEntity cloned = cloner.deepClone(this);
        return cloned;
    }
}

public class EntityA extends AbstractEntity {
    ...
}

這很好,我可以這樣做:

EntityA e1 = new EntityA();
EntityA e2 = (EntityA) e1.clone();

但我必須做一個手動的類型轉換。 有沒有辦法使用java Generics讓clone()方法返回子類的實際類型?

謝謝!

我能想到的最接近的是:

public abstract class AbstractEntity<T extends AbstractEntity<T>> 
    implements Cloneable {

    @SuppressWarnings("unchecked")
    public T clone() {
        Cloner cloner = new Cloner();
        T cloned = (T) cloner.deepClone(this);
        return cloned;
    }    
}

public class EntityA extends AbstractEntity<EntityA> { 
    ...
}

public class EntityB extends AbstractEntity<EntityB> { 
    ...
}

這不完全安全:你可以寫:

public class EvilClass extends AbstractEntity<EntityA> { 
    ...
}

...但這對你來說是否重要取決於你的用例。

我認為不需要仿制葯。 您可以在抽象類中聲明clone()方法,並覆蓋它以返回子類中的子類。

package inheritance;

public abstract class AbstractEntity {

    public abstract AbstractEntity clone();
}


package inheritance;

public class ClassA extends AbstractEntity {

    @Override
    public ClassA clone() { return null; }

}


package inheritance;

public class Driver {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ClassA a = new ClassA();
        ClassA b = a.clone();
        System.out.println("all done");
    }

}

這不是你想做的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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