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);