Java类变量
我有一个变量:Java类变量,java,class,variables,parameters,instance,Java,Class,Variables,Parameters,Instance,我有一个变量:抽象a。它是一个扩展抽象类的类。但是,我需要将这个Abstract变量转换为扩展Abstract类的更具体的类变量 我的情况:我有两个类,Class1和Class2,它们都扩展了Abstract类,每个类都实现了方法。我现在有一个抽象类变量可以使用。我不知道它是Class1还是Class2,所以我不能简单地做(Class1)a或(Class2)a(铸造) 那么,我如何成功地强制转换这个变量,以便使用内部方法呢 我一直在考虑使用a.getClass().getName()来确定如何强
抽象a
。它是一个扩展抽象类的类。但是,我需要将这个Abstract
变量转换为扩展Abstract
类的更具体的类变量
我的情况:我有两个类,Class1
和Class2
,它们都扩展了Abstract
类,每个类都实现了方法。我现在有一个抽象类变量可以使用。我不知道它是Class1
还是Class2
,所以我不能简单地做(Class1)a
或(Class2)a
(铸造)
那么,我如何成功地强制转换这个变量,以便使用内部方法呢
我一直在考虑使用a.getClass().getName()
来确定如何强制转换它,但从现在起我就陷入了困境。基本上你可以通过使用
类别cl=
cl.newInstance()
您可以找到更“扩展”的答案,您的新问题似乎是询问如何在运行时将变量动态转换为未知的任意类型。这可能是的一个副本,但概括地说,这是不可能的,不推荐使用,并且涉及代码中的其他问题
这样考虑一下,您可能会使用什么变量来存储新强制转换的对象?想象一下,如果我们在Java中有一个(child)
强制转换操作,该操作将一个定义为父类的变量向下转换为它的子类(例如,List->LinkedList):
请注意1)您无法为var
指定类型,因为我们不知道在运行时它将是什么类型;2)除了Abstract
中定义的行为之外,我们无法处理var,因为编译器无法预测除了Abstract
中可用的方法之外,哪些方法将可用于var
如果需要实现特定于类的行为,那么应该在类内部实现。有一个每个类都必须实现的抽象方法,它可以做任何你需要它们做的事情。或者,如果您不能确保这一点,请不要定义将摘要
作为参数的函数;相反,定义以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最初的问题是关于创建对象的新实例作为其抽象父对象
非常简单,获取对象的类对象,然后创建一个新实例。有关更复杂的构造函数,请参见
结果:
class ClassVar$Class1
class ClassVar$Class2
因为你在3小时前再次编辑了你的问题,在写这篇文章的时候,这里是我对一个我认为已经解决的问题的第二个答案。很明显,一开始没有人得到你真正想要的东西。试着改进你提问的方式。
然而,答案很简单:
- 从面向对象的角度来看,您根本不必()。即使您对两个可能的实例有确切的了解,也应该为您试图建模的问题寻找更好的方法
- 如果必须,确定类名并检查是否相等,或者携带一个额外的标识符并比较该标识符。实现再简单不过了
您能在定义和使用变量的地方发布示例代码吗?不清楚您正在谈论的变量是方法参数、局部变量还是实例变量。根据您的新问题更新了我的答案。同意@Genzer的说法,这里的代码示例将非常有用。我理解您的意思,但我如何才能做到这一点?假设我有100个扩展抽象的类。我不想用这么长的“如果”语句。
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