【发布时间】:2021-07-14 09:22:50
【问题描述】:
我有以下Java超级接口:
public interface IdProvider<T, ID> {
<S extends T> ID idOf(S entity);
ID nextId();
<S extends T> S entityWithId(S entity, ID id);
}
以及以下实现(内部)类:
class TestingEntityUuidProvider implements IdProvider<TestingEntity, UUID>{
@Override
public UUID idOf(TestingEntity entity) {...}
@Override
public UUID nextId() {...}
@Override
public TestingEntity entityWithId(TestingEntity entity, UUID id) {...}
}
虽然idOf() 方法和其他一切工作正常,但entityWithId() 方法会导致以下编译器警告:
Type safety: The return type TestingEntity for entityWithId(TestingEntity, UUID) from the type TestingEntityUuidProvider needs unchecked conversion to conform to S from the type IdProvider<T,ID>
谁能解释一下为什么会出现这种情况,还有什么更好的选择?
附: TestingEntity 只是一个带有 getter 的简单 POJO:
public class TestingEntity {
private final UUID id;
private final String content;
...
}
【问题讨论】:
-
在界面中,将类型参数
S添加到idOf和entityWithId背后的思路是什么?为什么不只是ID idOf(T entity);和T entityWithId(T entity, ID id);?毕竟,这就是TestingEntityUuidProvider实现的。 -
使用id提供者的代码使用了泛型子类,像这样:
@Override public <S extends T> S save(S entity) { final ID idToBeSaved = idToBeSavedFor(entity); S entityToBeSaved = idProvider.entityWithId(entity, idToBeSaved); entities.put(idToBeSaved, entityToBeSaved); return entityToBeSaved; `}