加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:05:17 所属栏目:Java 来源:网络整理
导读:对不起,如果这已经解释了,但我没有找到类似的线程在任何地方的网页. 今天我在IDE中打开了一个项目类,看到一个错误(红色下划线),尽管项目已经被成功编译了. 所以代码是: public interface DatasourceImplementationT extends Entity { ....}public interface
对不起,如果这已经解释了,但我没有找到类似的线程在任何地方的网页.

今天我在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)会更好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读