簡體   English   中英

使用Class.cast()方法的嵌套轉換

[英]Nested Casting using Class.cast() Method

我有一個Person類,它實現Cloneable 然后,我有對象po引用了一個Person對象。 我試圖將一個克隆到另一個,並發現以下工作原理:

Object p = new Person("Heather");
Object o = ((Person)p).clone();

(我必須使用該強制類型轉換,因為clone()在對象中受保護。我用它在Person調用clone() 。)

我需要知道的是如何使用Class.cast()執行上述Class.cast() 我知道如何投射一次,就像這樣:

Object o = p.getClass().cast(p);

但是我如何以這種方式做嵌套的轉換示例。 (我需要知道,因為在這個項目中,我並不總是知道要強制轉換為哪個類,但我將知道該類是Cloneable 。)

我試過...((Cloneable)p).clone()...但是那行不通。 clone()方法是Object類中的一種受保護方法,並且接口Cloneable沒有clone()方法,因此編譯器無法識別它。

我四處尋找答案,卻找不到一個答案。 謝謝您的幫助。

在代碼中使用clone()是不尋常的(我從未使用過它,也從未見過這樣顯式使用過它)。

復制的常用模式是復制構造函數 ,例如:

public class Person {
    private String name;
    public Person(String name) {
       this.name = name;
    }

    // Copy constructor
    public Person(Person person) {
        this(person.name);
    }
}

源對象的重要字段的值用於初始化新對象的字段值。

由於克隆的工作方式,這有點困難。 如您所見,幾乎克隆是一個受保護的方法,因此您需要在編譯時使用一個類來調用它。 有一種解決方法,就是聲明一個接口,為其分配公共訪問權限:

public interface PublicCloneable
extends Cloneable {
    public Object clone();
}

然后實現它而不是Cloneable。 然后,您可以強制轉換為PublicCloneable來調用克隆。 這樣就可以正常工作,但仍然會帶來克隆的所有正常問題。

創建副本構造函數是克隆的一種很好的替代方法,如果您在編譯時不知道該類,則可以創建一個使用反射來調用它的方法:

static Object reflectionCopy(Object obj) {
    try {
        Class<?> cls = obj.getClass();
        Constructor<?> ctor = cls.getConstructor(cls);
        return ctor.newInstance(obj);
    } catch(Exception e) {
        return obj;
    }
}

getClass始終返回Class<?>因此如果您不介意未經檢查的類型轉換,也可以將其設為泛型。)

可能您正在運行的內容表明您需要考慮設計。 就我個人而言,這聽起來像是通用工廠可能具有優勢的情況。

基本上是這樣的:

public interface Copier<T> {
    public T createCopy(T obj);
}

public class PersonCopier
implements Copier<Person> {
    @Override
    public Person createCopy(Person person) {
        return new Person(person.getName());
    }
}

public static <T> T doStuffInvolvingCopy(T inObject, Copier<T> copier) {
    ...

    T copy = copier.createCopy(inObject);

    ...

    return copy;
}

你可能會這樣稱呼

doStuffInvolvingCopy(new Person("Heather"), new PersonCopier());

或者也許將工廠注冊在某個地方,這樣就不需要傳遞它們。

工廠之所以好,是因為它們不使用克隆並且不使用反射。

暫無
暫無

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

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