1 回答
TA贡献1820条经验 获得超9个赞
编译错误的原因是由于Object.getClass()
方法。根据java文档:
返回此对象的运行时类。返回的 Class 对象是由所表示的类的静态同步方法锁定的对象。
实际结果类型是 Class where |X| 是调用 getClass 的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换:
数字 n = 0;
类 c = n.getClass();
打电话时return Result.builder(resource.getClass()).build();
resource.getClass()
Class<? extends Resource>
将像Resource
擦除一样返回T
Result.builder(resource.getClass())
方法将返回Builder<? extends Resource>
。Result.builder(resource.getClass()).build()
会回来的Result<? extends Resource>
。
的类型信息T
在步骤 1 中丢失。因此,编译错误显示为返回类型不兼容。可以进行以下更改来解决该错误。
更改构建器方法以接受
T
实例而不是Class<T>
评论中的状态。将调用者更改为传递
Class<T>
而不是Class<? extends Resource>
方法builder
。
更改的代码片段:
// Caller
// Solution 1
public <T extends Resource> Result<T> createResult(T resource) {
return Result.builder(resource).build();
}
// Solution 2
public <T extends Resource> Result<T> createResult(Class<T> resourceClass) {
return Result.builder(resourceClass).build();
}
public class Result<T extends Resource> {
...
//Solution 1
public static <T2 extends Resource> Builder<T2> builder(T2 instance) {
return new Builder<T2>();
}
// static factory method to get a builder
// Solution 2
public static <T2 extends Resource> Builder<T2> builder(Class<T2> clazz) {
return new Builder<T2>();
}
...
添加回答
举报