【发布时间】:2015-12-02 15:01:38
【问题描述】:
我的应用程序有一个简单的插件 API。它打包在插件开发人员可以使用的单独 JAR 中。核心应用实现 API 中包含的接口,并将它们暴露给加载了ServiceLoader 的插件。
考虑这段代码:
public interface ILayer {}
public class Layer implements ILayer {
public void internalMethod() { /*snip*/ }
}
public interface IPlotter {
List<ILayer> getLayers();
}
public class Plotter implements IPlotter {
private ObservableList<Layer> layers = FXCollections.observableArrayList();
@Override
public ObservableList<Layer> getLayers() { // incompatible returned type
return layers;
}
}
我的要求是:
- 在内部,
ObservableList的Layers 可用 - API 仅公开
List的ILayers
很遗憾,将ObservableList<Layer> 转换为List<ILayer> 是非法的。
在 API 中返回List<Layer> 会暴露Layer 中的internalMethod(),所以不好。
我也可以有private ObservableList<ILayer> layers,然后实际上将Layers 存储在里面,但是每次我使用internalMethod() 时都需要转换它的项目,而且我对这个想法不是很感兴趣。
这个问题有干净的解决方案吗?
【问题讨论】:
-
您可以使用
return (List<ILayer>)(List<?>)layers;克服转换错误
标签: java generics javafx interface casting