定义通用对象

时间:2017-05-29 03:20:40

标签: java class generics instantiation

从我的上一个问题here开始:

我有一个类似的课程:

public class nVector<T extends nVector<?>> {

    int i;

    public T add(T a) {

    }

}

并希望发生以下情况:

public T add(T a) {
    T b = this.clone();
    b.i += a.i;
    return b;
}

但是不允许通用类型T的实例化。然而,我可以轻松地在我的论证中包含一个T实例。

我这样做是因为我有多个T类型的子项继承了nVector中的所有方法,并在“封闭环境”中自行处理。 (即他们只把自己的类型作为论据,而不是其他孩子)

有什么方法可以解决这个问题?问题是,我 要返回T类型的内容,而不是nVector<?>

1 个答案:

答案 0 :(得分:2)

您可以将Class<T>传递给nVector构造函数。然后使用cls.newInstance()。像,

public class nVector<T extends nVector<?>> {
    Class<T> cls;
    int i; // <-- default value 0. Should probably be set in the constructor
           //     or with a setter method.
    public nVector(Class<T> cls) {
        this.cls = cls;
    }

    public T add(T a) {
        T b = null;
        try {
            b = cls.newInstance();
            b.i = this.i + a.i; // <-- equivalent, thx @LukeLee
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return b;
    }
}

当然,如果您只需要T返回 - 您可以return a;