使用泛型使 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> { ... }
我实现了以下 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> { ... }