2015-08-08 69 views
0

我有這樣的方法:爪哇 - 投一個非空對象動態對象

public static Object filterObject(Object object, String objectName){ 
     ... 
} 

這裏是我如何稱呼它:

Entity1 entity1 = new Entity1(); 
//Call some setters 
Test.filterObject(entity1, "Entity1"); 

我想投ObjectEntity1內該方法。我怎樣才能做到這一點?

編輯 我的問題是我怎麼能轉換成objectobjectName類的實例?

+2

你贏了」通過投射物體丟失任何數據。如果對象不能被轉換,它將工作或拋出ClassCastException。 – Codebender

+0

如果該方法需要將對象作爲「Entity1」的實例處理,那麼爲什麼不改變參數類型呢? –

+0

@KevinKrumwiede因爲'Entity1'只是一個例子。我想把它轉換成'xxx'。 – hamed

回答

0

由於Codebender告訴你,這是唯一指定的演員的問題:

public static Object filterObject(Object object, String objectName){ 
    Entity1 entity1 = (Entity1) object; 
    // Your implementation here 
    return entity1; 
} 

另一種方法是使用「仿製藥」,例如

public static <T extends Entity1> T filterObjectWithGeneric(T object, String objectName) { 
    // Your implementation here 
    return object; 
} 

問候。

+0

從問題的評論:「'Entity1'只是一個例子。」 – VGR

3

你應該使用泛型。

例如,

public static <T> T filterObject(T object, String objectName) { 
    ... 
} 

Entity1 entity1 = new Entity(); 
Test.filter(entity1, "Entity1"); 

通過使用泛型,你不需要投,可避免ClassCastException異常。基本上T可以用你的對象的類型來代替。

此外,如果要確保傳遞的對象是另一種類型的子類,還可以使用以下內容。

public static <T extends ParentClass> T filterObject(T object, String objectName) { 
    ... 
} 

編輯:你應該用在鑄造泛型由於上面,如果你並不需要不同類型的魚龍混雜所陳述的理由。請參閱這篇文章,瞭解您是否應該使用泛型。 https://stackoverflow.com/a/11402351/5085407

+0

是的!你是對的。不知道爲什麼我嘗試了投線 – Pumphouse

+0

其實,這是因爲OP要求施放,但我相信你是對的,無論 – Pumphouse

+0

對,但我的問題是如何將'object'轉換爲'objectName'類的實例。 – hamed

1

如果可能的話,你應該通過實際的類對象:

public static <T> T filterObject(Object object, Class<T> desiredClass) { 
    return desiredClass.cast(object); 
} 

如果你真的必須通過一個類名,你可以使用的Class.forName:

public static Object filterObject(Object object, String className) 
throws ClassNotFoundException { 
    Class<?> desiredClass = Class.forName(className); 
    return desiredClass.cast(object); 
}