Java - 类变量

标签 java class variables parameters instance

我有一个变量:抽象a。它是一个扩展 Abstract 类的类。但是,我需要将此 Abstract 变量转换为扩展 Abstract 类的更具体的类变量。

我的情况:我有两个类,Class1Class2,它们都扩展了 Abstract 类,并在每个类中实现了方法。我现在有一个可以使用的 Abstract 类变量。我不知道它是 Class1 还是 Class2,所以我不能简单地执行 (Class1) a(Class2) a(选角)。

那么我如何成功地转换这个变量以便我可以使用内部方法?

我正在考虑使用 a.getClass().getName() 来确定如何转换它,但从这里开始我就陷入了困境。

最佳答案

您的新问题似乎是在询问如何将变量动态转换为运行时未知的任意类型。这可能是 java: how can i do dynamic casting of a variable from one type to another? 的重复项但总而言之,这不可能(轻易)实现,也不推荐,并且会涉及代码中的其他问题。

这样想一下,您可以使用什么变量来存储新转换的对象?想象一下,如果我们在 Java 中有一个 (child) 转换操作,它接受一个定义为父类的变量,并将其向下转换为其子类(例如 List -> LinkedList):

public static void func(Abstract a){
    ???? var = (child)a;
    // Do something with var?
}

请注意,1)您无法为 var 指定类型,因为我们在运行时不知道它是什么类型; 2)无论如何,除了 Abstract 中定义的行为之外,我们无法对 var 做任何事情,因为编译器无法预测 var 可以使用哪些方法Abstract 可用的内容除外。

如果您需要实现特定于类的行为,则应该在类内部执行此操作。有一个每个类都必须实现的抽象方法,并且可以执行您需要它们执行的任何操作。或者,如果您不能确保这一点,请不要定义采用 Abstract 作为参数的函数;相反,定义许多采用 Class1Class2 等对象作为参数的函数,如下所示:

要求所有子类表现相似的抽象方法

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 调用 block 是 Not Acceptable ),那么我愿意打赌,其中存在一些结构性的问题你使用的 Java 从根本上来说是错误的。如果您想发布一个代码示例来准确说明您试图通过子类型转换来完成的任务,也许我们可以阐明问题所在。

<小时/>

将其留在这里供后代使用 - OP 的原始问题询问有关创建对象的新实例并将其转换为其抽象父对象。

非常简单,获取对象的类对象,并创建一个新实例。对于更复杂的构造函数,请参阅 Java documentation on creating new instances dynamically .

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

关于Java - 类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486029/

相关文章:

java - Java 对象的可序列化错误

java - 在 Java 中将命令提示符输出到字符串

javascript - Vue.js:导入带有函数的类并在子组件中调用它

jquery - JavaScript/jQuery 在两个函数中使用一个变量的最佳解决方案?例子

javascript - 使变量不是全局的

iOS如何从 block 中获取变量值?

java.io.filenotfoundException 下载 zip 并解压

java - 从 server.xml 按名称读取变量

依赖于某些参数的 Java 类

c++ - 更改类内的结构或类 |有或没有指针