Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java的许多子类中确定子类_Java_Inheritance_Instanceof_Subclass - Fatal编程技术网

从Java的许多子类中确定子类

从Java的许多子类中确定子类,java,inheritance,instanceof,subclass,Java,Inheritance,Instanceof,Subclass,我有一个接口树和一个实现这个接口的抽象类RBTree。我还有几个类Tree1…Tree9,它们扩展了这个抽象类 我已经编写了一个测试单元,我想在其中执行以下操作: public void testRandom(RBTree tree){ for(int i = 0; i < 10; i++){ rbTree = new Tree1(); //if the tree in the parameter was of instance Tree1 rbTr

我有一个接口
和一个实现这个接口的抽象类
RBTree
。我还有几个类
Tree1
Tree9
,它们扩展了这个抽象类

我已经编写了一个测试单元,我想在其中执行以下操作:

public void testRandom(RBTree tree){
    for(int i = 0; i < 10; i++){
        rbTree = new Tree1(); //if the tree in the parameter was of instance Tree1
        rbTree = new Tree2(); //if the tree in the parameter was of instance Tree2
        //etc.

        /**
         * do something with rbTree
         */
    }
}
public void testRandom(RBTree树){
对于(int i=0;i<10;i++){
rbTree=new Tree1();//如果参数中的树是实例Tree1
rbTree=new Tree2();//如果参数中的树是实例Tree2
//等等。
/**
*用这棵树做点什么
*/
}
}
如果不使用一系列if语句(或开关)和大量的
instanceof()
,是否可以做到这一点


(注意:我不能改变任何设计,我知道它不是真正的最优)

您可以使用
tree.getClass().newInstance()


如果您想拥有比实例化更复杂的逻辑,您可能需要instanceof方法,或者更好-使每个
RBTree
子类都有一个执行该逻辑的方法(并使该方法在
RBTree
中抽象)

您可以使用
tree.getClass().newInstance()

如果您想拥有比实例化更复杂的逻辑,您可能需要instanceof方法,或者更好-使每个
RBTree
子类都有一个执行该逻辑的方法(并使该方法在
RBTree
中抽象)

尝试以下方法:

rbTree = tree.class.newInstance();
试试这个:

rbTree = tree.class.newInstance();

使用反射,您可以:

string name = tree.getClass().getName()
Class.forName(name).newInstance();

问题是,如果实际实现有不同的方法等,您将无法访问它们。

使用反射,您可以:

string name = tree.getClass().getName()
Class.forName(name).newInstance();

问题是,如果实际的实现有不同的方法等,您将无法访问它们。

为什么要添加额外的行和遍历字符串?在这种情况下,这并不是真正必要的,但它确实提供了一种替代其他答案的方法,这可能很方便。我不知道他的其他代码,也许他比现在更喜欢传递类名。这可能会引起哼哼的思考。仅此而已。除非通过外部系统,否则不应传递类名。JVM中的类由一个类objectwhy表示,为什么需要额外的行和遍历字符串?在本例中,这并不是必需的,但它确实提供了一个替代其他答案的方法,这可能很方便。我不知道他的其他代码,也许他比现在更喜欢传递类名。这可能会引起哼哼的思考。仅此而已。除非通过外部系统,否则不应传递类名。JVM中的类由类对象表示,非常简单。同样感谢您提及替代方法。非常简单。也感谢您提到替代方法。