2 回答
TA贡献1830条经验 获得超9个赞
正如评论中提到的,您可以通过使用反射和Class.cast方法来做到这一点:
public Object cast(Object object, String typeToCastTo) {
switch (typeToCastTo) {
case "foo":
return Foo.class.cast(object);
case "otherType":
return OtherType.class.cast(object);
}
}
但是,该方法的返回类型必须是,Object因为您不知道参数中编码的实际返回类型typeToCastTo。
也就是说,如果您手头有一个 Class 的实例,那么它至少有意义:
Class<Foo> fooClass = (Class<Foo>) Thread.currentThread().getContextClassLoader().loadClass("my.foo.Foo");
Foo fooObject = foo.cast(object);
但这一切似乎毫无意义......
根据评论。要调用父类的私有方法,您不需要强制转换:
Object object = new SubFoo();
Method privateFooMethod = Arrays.asList(ParentFoo.class.getDeclaredMethods())
.stream().filter(m -> m.getName().equals("privateFooMethod")).findAny()
.get();
privateFooMethod.setAccessible(true);
privateFooMethod.invoke(object);
但在使用反射来实现这样的事情之前,你真的应该三思而后行。这看起来像是一个糟糕的类/接口设计,导致为相当基本的需求提供了奇怪的解决方案。
TA贡献1811条经验 获得超6个赞
替代方法(虽然我不知道这是否被认为是不好的做法):
public TypeToCastTo Cast(T object, String TypeToCastTo) {
switch (TypeToCastTo) {
case "foo":
return new Foo(object);
case "otherType":
return new OtherType(object);
...
}
}
对于您想要处理的不同类型,您将需要带有相应参数(重载)的特定构造函数。在这些构造函数中,您可以控制从一种类型到另一种类型的精确“翻译”。
添加回答
举报