如何在Java 8中使用子类进行方法链接
发布时间:2020-12-15 02:20:29 所属栏目:Java 来源:网络整理
导读:我按照 this pattern在Java中实现了子类的方法链接.目标是我在超类上有一个方法,但可以分配子类,如: interface Screen { T extends Screen T setBrightness(int value); T extends Screen T setContrast(int value);}class CrtScreen implements Screen { @
我按照
this pattern在Java中实现了子类的方法链接.目标是我在超类上有一个方法,但可以分配子类,如:
interface Screen { <T extends Screen> T setBrightness(int value); <T extends Screen> T setContrast(int value); } class CrtScreen implements Screen { @SuppressWarnings("unchecked") @Override public <T extends Screen> T setBrightness(int value) { // ... return (T) this; } @SuppressWarnings("unchecked") @Override public <T extends Screen> T setContrast(int value) { // ... return (T) this; } } class ColorCrt extends CrtScreen { /* ... */ } public static void main(String[] args) { ColorCrt cc = new ColorCrt().setBrightness(50).setContrast(50); } 现在我还有我想要添加对象的容器对象,例如: class Stuff { Stuff add(Screen s) { // ... return this; } Stuff add(String s) { // ... return this; } Stuff add(int i) { // ... return this; } } public static void main(String[] args) { new Stuff().add(new ColorCrt().setBrightness(50).setContrast(50)).add(25).add("..."); } 这现在不再适用于Java 8,给我的方法add(Screen)对于Stuff类型是不明确的.我理解为explained here的原因.我目前只看到两个选项: >我不使用< T extends,而只是使用Screen setBrightness(value).我需要选择将我的实现类分配给一个相应的变量,当我想执行一个特定于实现的方法时,我必须抛出它. 有没有办法在Java 8中实现方法链接,以便我仍然有这两个功能?如果没有,那么这两种方法中的一种是否可以被认为更有意义? 解决方法
在你的代码中:
class CrtScreen implements Screen { @SuppressWarnings("unchecked") @Override public <T extends Screen> T setBrightness(int value) { // ... return (T) this; } @SuppressWarnings("unchecked") @Override public <T extends Screen> T setContrast(int value) { // ... return (T) this; } } 您的成员函数setContrast和setBrightness不需要是通用的,如果它是通用的,您需要指定类型(在调用站点).我使用这种方法,而不是使接口通用,这意味着方法不需要: interface Screen<T extends Screen> { T setBrightness(int value); T setContrast(int value); } class CrtScreen implements Screen<CrtScreen> { @SuppressWarnings("unchecked") @Override public CrtScreen setBrightness(int value) { // ... return this; } @SuppressWarnings("unchecked") @Override public CrtScreen setContrast(int value) { // ... return this; } } 如果您想按照自己的方式进行操作,则需要指定哪种类型适用于通用(见下文): public static void main(String[] args) { new Stuff() .add(new ColorCrt().<ColorCrt>setBrightness(50)) .add(25).add("..."); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |