对不起,如果这已经解释了,但我没有找到类似的线程在任何地方的网页.
今天我在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给了我错误(不兼容的类型) – 我认为是对的.
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)会更好.