我正在创建一个'SpecialList‘,我需要实现地图功能。该列表应该是惰性的,并且仅在计算时才会产生值。
toString()返回"?“如果值尚不可用,则返回值的字符串表示形式,否则返回值的字符串表示形式。
在需要内容时调用get()。如果该值已经可用,则返回该值;否则,计算该值并返回它。对于相同的值,计算应该只进行一次。
这就是我所拥有的:
public <U> SpecialList<U> map(Function<T, U> mapper) {
if (!this.isAvailable) {
return new SpecialList<U>(this.supplier);
}
return new SpecialList<U>(mapper, value);
}
// private constructor
private SpecialList(CachedSupplier<T> s) {
this.supplier = s;
this.isAvailable = false;
}然而,它告诉我没有有效的构造器,因为T不能转换为U。
SpecialList.java:65: error: no suitable constructor found for SpecialList(SpecialList<T>.CachedSupplier<T>)
return new SpecialList<U>(this.supplier);
^
constructor SpecialList.SpecialList(U) is not applicable
(argument mismatch; SpecialList<T>.CachedSupplier<T> cannot be converted to U)
constructor SpecialList.SpecialList(Supplier<U>) is not applicable
(argument mismatch; SpecialList<T>.CachedSupplier<T> cannot be converted to Supplier<U>)返回时,“U”不会变成T吗?
我该如何着手解决这个问题?关于方法级别的泛型类型,我仍然不太清楚。但是我被告知需要为我的map方法添加。
下面是我的完整代码:
class SpecialList<T> {
class CachedSupplier<T> {
private Supplier<? extends T> supplier;
private T value;
boolean isAvailable;
public CachedSupplier(Supplier<? extends T> supplier) {
this.supplier = supplier;
}
public T get() {
if (!isAvailable) {
value = supplier.get();
isAvailable = true;
}
return value;
}
}
private CachedSupplier<T> supplier;
private T value;
boolean isAvailable;
private SpecialList(T value) {
this.value = value;
this.isAvailable = true;
}
private SpecialList(Supplier<T> s) {
this.supplier = new CachedSupplier<T>(s);
this.isAvailable = false;
}
private SpecialList(CachedSupplier<T> s) {
this.supplier = s;
this.isAvailable = false;
}
private <R> SpecialList(Function<T, R> mapper, T v) {
this.supplier = new CachedSupplier<T>(() -> mapper.apply(v));
this.isAvailable = false;
}
public static <T> SpecialList<T> of(T value) {
return new SpecialList<>(value);
}
public static <T> SpecialList<T> of(Supplier<T> supplier) {
return new SpecialList<>(supplier);
}
public <R> SpecialList<R> map(Function<? super T,? extends R> mapper) {
if (!this.isAvailable) {
return new SpecialList<>(this.supplier);
}
return new SpecialList<R>(mapper, value);
}
public T get() {
if(this.isAvailable) {
return this.value;
} else {
this.value = this.supplier.get();
this.isAvailable = true;
return this.value;
}
}
}我仍然对泛型类型等有点困惑,所以如果有什么奇怪的地方,请告诉我/我可以改进!
谢谢
发布于 2019-11-06 10:38:42
根据您发布的代码,在类SpecialList的一个构造函数中存在编译时错误...
private <R> SpecialList(Function<T, R> mapper, T v) {
this.supplier = new CachedSupplier<T>(() -> mapper.apply(v));
this.isAvailable = false;
}首先,在您发布的代码中,内部类CachedSupplier中没有接受Function参数的构造函数,因此需要添加一个带有此签名的构造函数:
public <R> CachedSupplier(Function<T, R> mapper)SpecialList构造函数的第二个问题是λ表达式。接口Function中的抽象方法apply有一个参数,而您的lambda表达式缺少该参数。所以构造函数代码应该是:
private <R> SpecialList(Function<T, R> mapper, T v) {
this.supplier = new CachedSupplier<T>((v) -> mapper.apply(v));
this.isAvailable = false;
}https://stackoverflow.com/questions/58721937
复制相似问题