2015-08-08 48 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); 
}