当前位置:  开发笔记 > 编程语言 > 正文

清洁解决方案"将"ObservableList <Foo>"强制转换为List <IFoo>?

如何解决《清洁解决方案"将"ObservableList<Foo>"强制转换为List<IFoo>?》经验,为你挑选了1个好方法。

我的应用程序有一个简单的插件API.它打包在一个单独的JAR中,插件开发人员可以使用它.核心应用程序实现API中包含的接口,并将它们暴露给加载的插件ServiceLoader.

考虑以下代码:

public interface ILayer {}

public class Layer implements ILayer {
    public void internalMethod() { /*snip*/ }
}

public interface IPlotter {
    List getLayers();
}

public class Plotter implements IPlotter {
    private ObservableList layers = FXCollections.observableArrayList();

    @Override
    public ObservableList getLayers() {  // incompatible returned type
        return layers;
    }
}

我的要求是:

在内部,ObservableListLayers是可用

API只公开了一个ListILayer小号

不幸的是,铸造ObservableListList是违法的.

List在API中返回会暴露internalMethod()出来Layer,所以这没有用.

我也可以private ObservableList layers,然后实际存储Layer内部,但这需要每次使用时都会投射它的项目internalMethod(),我对这个想法并不是很热心.

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



1> assylias..:

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

interface IPlotter {
    List getLayers();
}

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

    @Override
    public List getLayers() {
        return layers;
    }
}

主要的缺点是有人调用List layers = plotter.getLayers();将无法添加到列表:layers.add(someLayer);将无法编译.这可能是也可能不是问题.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有