到 List 的干净解决方案?-6ren"> 到 List 的干净解决方案?-我的应用程序有一个简单的插件 API。它打包在一个单独的 JAR 中,供插件开发人员使用。核心应用程序实现 API 中包含的接口(interface),并将它们暴露给加载 ServiceLoader -6ren">
gpt4 book ai didi

java - "cast"ObservableList 到 List 的干净解决方案?

转载 作者:行者123 更新时间:2023-12-02 03:59:19 27 4
gpt4 key购买 nike

我的应用程序有一个简单的插件 API。它打包在一个单独的 JAR 中,供插件开发人员使用。核心应用程序实现 API 中包含的接口(interface),并将它们暴露给加载 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;
}
}

我的要求是:

  • 内部,ObservableListLayer s可用
  • API 仅公开 ListILayer s

不幸的是,类型转换ObservableList<Layer>List<ILayer>是非法的。

返回List<Layer> API 中会公开 internalMethod()Layer ,所以这不好。

我还可以有private ObservableList<ILayer> layers ,然后实际存储 Layer里面,但是每次我使用 internalMethod() 时都需要转换它的项目我对这个想法不太热衷。

这个问题有干净的解决方案吗?

最佳答案

一种选择是更改接口(interface)方法的签名以允许返回 ILayer 的子类型:

interface IPlotter {
List<? extends ILayer> getLayers();
}

class Plotter implements IPlotter {
private ObservableList<Layer> layers = FXCollections.observableArrayList();

@Override
public List<? extends ILayer> getLayers() {
return layers;
}
}

主要缺点是有人打电话 List<? extends ILayer> layers = plotter.getLayers();将无法添加到列表:layers.add(someLayer);不会编译。这可能是也可能不是问题。

关于java - "cast"ObservableList<Foo> 到 List<IFoo> 的干净解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34045925/

27 4 0