java – 关于不兼容的转换没有编译器错误

对不起,如果这已经解释了,但我没有找到类似的线程在任何地方的网页.

今天我在IDE中打开了一个项目类,看到一个错误(红色下划线),尽管项目已经被成功编译了.

所以代码是:

public interface DatasourceImplementation<T extends Entity> {
     ....
}

public interface Datasource<T extends Entity> {
     ....
}


public interface DsContext {
    @Nullable
    <T extends Datasource> T get(String name);
}

现在我们称之为这样的方法

DatasourceImplementation dsImpl = getDsContext().get("dsName");

Idea13给了我错误(不兼容的类型) – 我认为是对的.

Idea14在这里没有显示任何错误.

JDK编译没有错误 – 这很难过.

必须说,在我们的项目实现类A接口总是实现B接口(可能解释为什么Idea14表示可以),但在我看来,这无法证明这一行为 – 因为通常我可以创建实现A和不我要实现B.我想在我的代码中静态类型化,我不想看到运行时类转换异常.

那么谁在这里错了?

UPD.添加一个真正的类的屏幕截图(不确定它将会解释更多的东西,它和我所描述的一样)

解决方法

JDK是正确的声明承诺返回ANY数据源,如果它不匹配,将只会有一个运行时错误.编译器可能会显示一些严重的警告,但应该编译它.您的代码段的原始开发人员可能意图避免在每个调用中显式转换.

根据意图解决方法的不同方法

> DataSource<?> get(String name):调用者需要转换DatasourceImplementation.>< T extends Datasource> T get(Class< T> dsType,String name).被叫功能可以在运行时检查或选择返回的类型,例如稍微返回Impl1或Impl2.>< T extends Entity>‘数据源< T> get(String name):这可能是打算的.只要DatasourceImplementation不需要知道具体的实体类型就可以工作.如果它确实需要知道,那么< T扩展实体>‘数据源< T> get(Class< T> entityType,String name)会更好.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...