Java:如何重构未知类

Java:如何重构未知类,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我有一个实例化泛型对象的类,它可以是特定类的任何一个子类: abstract class Sport; class Basketball extends Sport { Basketball (Team teamA, Team teamB) { /*set sport rules*/ } } class Soccer extends Sport { Soccer (Team teamA, Team teamB) { /*set sport rules*/ } } class M

我有一个实例化泛型对象的类,它可以是特定类的任何一个子类:

abstract class Sport;
class Basketball extends Sport {
    Basketball (Team teamA, Team teamB) { /*set sport rules*/ }
}
class Soccer extends Sport {
    Soccer (Team teamA, Team teamB) { /*set sport rules*/ }
}

class Match {
    Sport s;

    Match (Sport y) { this.s = y; }

    void playMatch ();
}
我希望能够通过调用方法的构造函数来重置方法中的对象:

void playMatch () {
    this.s = new /*class of s*/();
    /*do stuff with s*/
}

我该怎么做呢?

如果你知道你的s构造函数没有参数,你可以调用:

s.getClass().newInstance()
否则,如果你知道它是构造函数的参数

Constructor ctor = s.getClass().getConstructor(TypeA.class, TypeB.class, etc...);
S sInstance = (S)ctor.newInstance(typeAValue, typeBValue, etc...Value);
否则,您可以使用,它可以生成您需要的任何类型的类,但是请注意,通过使用该方法,您可以在不调用任何构造函数的情况下获得对象,这可能是危险的。您必须告诉objeness手动调用构造函数,但同样,您必须知道它需要的参数


但我不明白你的密码。。。是java还是伪代码


既然你发布了一些真实的代码,我就不建议你使用这个答案。事实上,这是从未知类实例化对象的方法,但在您的情况下,不应该这样做

我建议您在
Sport
类中添加
reset()
方法。 使用反射实例化对象是危险的;如果构造函数参数发生更改,则在编译时不会注意到。它在运行时也很慢,尽管现在这不是什么大问题。。。除非你每秒叫它1000次

它还使您能够实现更高版本,以便跟踪运动的状态。还有很多其他的事情会阻止你去做


你真的不应该这样做。

你想要
method
根据
s
中当前存储的对象类型构造一个对象?
super
是一个关键字,你不能用它作为类名……请只发布真实的代码,而不是某种类型的代码。“但我不理解你的代码……是java还是伪代码?”对