我有以下课程:
public interface Entity {
}
public class EntityImpl implements Entity {
}
public interface Service<T extends Entity> {
T find(int id);
Optional<T> findOptional(int id);
}
public class ServiceImpl implements Service<EntityImpl> {
@Override
public EntityImpl find(int id) {
return new EntityImpl();
}
@Override
public Optional<EntityImpl> findOptional(int id) {
return Optional.of(new EntityImpl());
}
}
public class NewMain {
public static void main(String[] args) {
Service service = new ServiceImpl();
Entity e1 = service.find(1);
Optional<Entity> opt = service.findOptional(1);
Entity e2 = service.findOptional(1).get(); //compile error
}
}
如果保存可选项,我可以正确获取正确的Optional类型,但是如果我想在返回的泛型上调用一个方法可选,那么编译器似乎正在丢失类型边界而我只得到一个Object。在e2行中,我从javac得到以下错误:
incompatible types: java.lang.Object cannot be converted to Entity
为什么丢失类型信息?我该如何解决这个问题?
答案 0 :(得分:3)
您使用的是原始类型。你最好选择:
Service<EntityImpl> service = new ServiceImpl();
另外,service.findOptional(1)
会返回Optional<EntityImpl>
,而不是Optional<Entity>
。