在泛型类中使用时,为什么泛型类型边界会丢失?

时间:2017-07-28 14:00:53

标签: java generics

我有以下课程:

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

为什么丢失类型信息?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您使用的是原始类型。你最好选择:

Service<EntityImpl> service = new ServiceImpl();

另外,service.findOptional(1)会返回Optional<EntityImpl>,而不是Optional<Entity>