gpt4 book ai didi

Java通用通配符用法

转载 作者:行者123 更新时间:2023-12-02 12:20:48 26 4
gpt4 key购买 nike

这与java通用通配符有关。

我有这样的界面。

public interface Processer<P, X> {
void process(P parent, X result);
}

像这样的实现。

public class FirstProcesser implements Processer<User, String> {
@Override
public void process(User parent, String result) {

}
}

我正在使用处理器。

public class Executor {
private Processer<?, String> processer;

private int i;
public void setProcesser(Processer<?, String> processer) {
this.processer = processer;
}

private String generateString() {
return "String " + i++;
}

public <P> void execute(P parent) {
processer.process(parent, generateString());
}

public static void main(String[] args) {
Executor executor = new Executor();
executor.setProcesser(new FirstProcesser());
User user = new User();
executor.execute(user);
}
}

但是这里

public <P> void execute(P parent) {
processer.process(parent, generateString());
}

它给出编译错误 Error:(18, 27) java: 不兼容的类型: P 无法转换为 capture#1 of ?

我需要理解为什么会出现错误。也解。

最佳答案

通配符基本上意味着“我不关心这里使用哪种类型”。就您而言,您肯定要关心:处理器的第一个类型参数必须与执行方法中的 P 类型相同。

使用当前代码,您可以调用 execute(1),它会尝试使用整数作为参数来调用 FirstProcesser,这显然没有意义,因此编译器会禁止它。

最简单的解决方案是使您的 Executor 类通用,而不仅仅是执行方法:

public class Executor<P> {
private Processer<P, String> processer;

private int i;
public void setProcesser(Processer<P, String> processer) {
this.processer = processer;
}

private String generateString() {
return "String " + i++;
}

public void execute(P parent) {
processer.process(parent, generateString());
}

public static void main(String[] args) {
Executor executor = new Executor<User>();
executor.setProcesser(new FirstProcesser());
User user = new User();
executor.execute(user);
}
}

关于Java通用通配符用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45807905/

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