0

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

我的情况:我有两个类,Class1它们Class2都扩展了Abstract类,每个类都实现了方法。我现在有一个Abstract类变量可以使用。我不知道它是Class1or Class2,所以我不能简单地做 a (Class1) aor a (Class2) a(铸造)。

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

我一直在考虑使用a.getClass().getName()来确定如何投射它,但我从这里开始就被困住了。

4

3 回答 3

1

您的新问题似乎是在询问如何在运行时将变量动态转换为未知的任意类型。这可能是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
于 2012-07-14T18:03:02.590 回答
0

基本上你可以使用反射来使用

类 cl = ...

cl.newInstance()

您可以在此处找到更“扩展”的答案

于 2012-07-14T17:58:06.260 回答
0

由于您在撰写本文时 3 小时前再次编辑了您的问题,这是我对我认为已解决的问题的第二个答案。很明显,没有人得到你真正想要的东西。尝试改进你提问的方式。
然而,答案很简单:

  • 从面向对象的角度来看,您根本不应该这样做(里氏替换原则)。即使您对两个可能的实例有确切的了解,您也应该为您尝试建模的问题寻找更好的方法。

  • 如果必须,确定类名并检查是否相等或携带一个额外的标识符并进行比较。实施再简单不过了。

于 2012-07-15T20:24:43.053 回答