[英]Nested Casting using Class.cast() Method
我有一個Person
類,它實現Cloneable
。 然后,我有對象p
和o
引用了一個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.