gpt4 book ai didi

java - 如何在 Java 8 中使用子类进行方法链接

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:58 25 4
gpt4 key购买 nike

我关注了this pattern在 Java 中实现与子类的方法链接。目标是我在父类(super class)上有一个方法,但可以分配子类,例如:

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 中不再有效,给我 The method add(Screen) is ambiguous for the type Stuff。我理解的原因是 explained here .我目前只看到两个选项:

  • 我不使用 <T extends , 但只是 Screen setBrightness(value) .我可以选择将我的实现类分配给相应的变量,当我想执行特定于实现的方法时,我必须强制转换它。

  • 我必须在我的方法链中添加强制转换或类型参数。这很丑对于必须从 Java 7 移植的大型结构(多级装箱),易于阅读且难以修复。

有没有一种方法可以在 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)通用的方法,这意味着方法不必是:

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("...");
}

关于java - 如何在 Java 8 中使用子类进行方法链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46663675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com