您的新问题似乎是在询问如何在运行时将变量动态转换为未知的任意类型。这可能是java 的副本:如何将变量从一种类型动态转换为另一种类型?但总而言之,这是不可能的,不建议这样做,并且会涉及代码中的其他问题。
这样想,你可以使用什么变量来存储你的新铸造对象?想象一下,如果我们(child)
在 Java 中有一个强制转换操作,它接受一个定义为父类的变量,并将其强制转换为它的子类(例如 List -> LinkedList):
public static void func(Abstract a){
???? var = (child)a;
// Do something with var?
}
请注意 1) 您无法为 指定类型var
,因为我们在运行时不知道它将是什么类型;和 2) 除了定义在任何情况下的行为之外,我们无法对 var 做任何事情Abstract
,因为编译器无法预测var
除了对Abstract
.
如果您需要实现特定于类的行为,则应该在类内部进行。有一个每个类都必须实现的抽象方法,它可以做你需要他们做的任何事情。或者,如果您不能确保这一点,请不要定义以 anAbstract
作为参数的函数;而是定义许多将Class1
,Class2
等对象作为参数的函数,如下所示:
要求所有子类行为相似的抽象方法
public abstract class Abstract{
/** Do the class-specific behavior you want to do currently in func */
public abstract void operation();
public static void func(Abstract a){
a.operation();
}
}
仅适用于可以实际处理您想要的类的函数
public static void func(Class1 a){
// do something
}
public static void func(Class2 a){
// do something
}
同样,如果这些选项对您都不可行(当然,instanceof
调用块是不可接受的),那么我愿意打赌,您使用 Java 的方式存在结构性问题,这从根本上是不正确的。如果您想发布一个代码示例,说明您正在尝试通过孩子铸造来完成什么,也许我们可以阐明问题所在。
把这个留给后代- OP 的原始问题询问了创建一个对象的新实例作为其抽象父对象。
很简单,获取对象的类对象,然后创建一个新实例。有关更复杂的构造函数,请参阅有关动态创建新实例的 Java 文档。
public class ClassVar
{
public static abstract class Abstract
{
}
public static class Class1 extends Abstract
{
}
public static class Class2 extends Abstract
{
}
/**
* Given an instance of a child of Abstract, returns a new instance
* of the same class
*/
public static Abstract newInstance(Abstract obj) throws InstantiationException, IllegalAccessException
{
return obj.getClass().newInstance();
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException
{
System.out.println(newInstance(new Class1()).getClass());
System.out.println(newInstance(new Class2()).getClass());
}
}
结果:
class ClassVar$Class1
class ClassVar$Class2