使用泛型使 class 的方法能够 return 其自身及其子 classes 实例

Make method of class using generics be able to return both its own and its subclasses instances

我实现了以下 Java 类:

public class Data<T> {

    private List<T> data;

    public List<T> getData() {
        return this.data;
    }


    public Data<T> setData(List<T> data) {
        this.data = data;
        return this;
    }

    public Data<T> getAsNullIfEmpty() {
        if (this.data == null || this.data.isEmpty())
            return null;
        return this;
    }

}
public class IntegerData extends Data<Integer> {}

我希望 getAsNullIfEmpty() 方法能够被其子类 实例调用。

IntegerData integerData = new IntegerData().getAsNullIfEmpty();抛出如下编译错误: incompatible types: Data<java.lang.Integer> cannot be converted to IntegerData

我尝试将方法的主体 getAsNullIfEmpty() 更改为:

public <E extends Data<T>> E getAsNullIfEmpty() {
    if (this.data == null || this.data.isEmpty())
        return null;
    return this;
}

这不会编译,因为 Data<T> 不会自行扩展。 有没有一种方法可以在不重复覆盖每个子 类 中的方法或使用显式强制转换的情况下完成此操作?

您需要 "usual" 技巧来让 class 的泛型引用自身,再加上不安全的转换。

public class Data<T, D extends Data<T, D>> {

    private List<T> data;

    public List<T> getData() {
        return this.data;
    }


    public D setData(List<T> data) {
        this.data = data;
        return (D) this;
    }

    public D getAsNullIfEmpty() {
        if (this.data == null || this.data.isEmpty())
            return null;
        return (D) this;
    }

}
public class IntegerData extends Data<Integer, IntegerData> { ... }