Java 如何在不事先知道的情况下实例化子类?
我创建了以下类:Java 如何在不事先知道的情况下实例化子类?,java,object,generics,instantiation,Java,Object,Generics,Instantiation,我创建了以下类: public class Abuser { <T extends Spam> List<T> createSpam() { List<T> lst = new ArrayList<>(); T s = new T(); s.prepareAd(); lst.add(s); // the above is done unknown numbe
public class Abuser {
<T extends Spam> List<T> createSpam() {
List<T> lst = new ArrayList<>();
T s = new T();
s.prepareAd();
lst.add(s);
// the above is done unknown number of times
return lst;
}
}
以以下方式:
Abuser a = new Abuser();
Lost<WildSpam> wSpam = a.createSpam();
List<MildSpam> mSpam = a.createSpam();
如何以最小的麻烦使其工作?Java应该知道必须创建哪些对象。您必须向方法传递一些参数以通知它 像这样:
public class Abuser {
<T extends Spam> T createSpam(T a) {
T s = null;
try {
Class cls = Class.forName(a.getClass().getName());
s = (T) cls.newInstance();
s.prepareAd();
// the above is done unknown number of times
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
}
此代码针对的是一个对象,而不是对象列表。好吧,您事先就知道了。因此,创建两个方法而不是一个:createWildSpam和createMildSpam。多态性在Java或任何OOP语言中的用途正是,您希望在不知道垃圾邮件对象的具体实现是什么的情况下使用它。你能澄清一下你想在这里做什么吗?可能是@vkamenen的重复,那么它可能不是实例化垃圾邮件对象的那个。您可以使用createSpamSupplier spamSupplier作为方法签名,并将其称为createSpamWildSpam::new。在您的示例中,createSpam创建单个垃圾邮件对象。所以要么你的例子是错误的,要么你的评论是错误的。你需要问我们你想要我们回答的真正问题。谢谢。正如评论中的相关问题一样,这似乎是这个残废的语言唯一可行的方法,它只能产生NullPointerException。我很抱歉。我修改了答案。但这是一个对象,而不是对象列表。
public class Abuser {
<T extends Spam> T createSpam(T a) {
T s = null;
try {
Class cls = Class.forName(a.getClass().getName());
s = (T) cls.newInstance();
s.prepareAd();
// the above is done unknown number of times
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
}
Abuser a = new Abuser();
WildSpam wSpam=new WildSpam();
wSpam=a.createSpam(wSpam);
MildSpam mSpam = new MildSpam();
mSpam=a.createSpam(mSpam);