gpt4 book ai didi

java - 我可以简化这个 Java 泛型层次结构吗

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

有时在我的代码中我想引用(我认为的)泛型层次结构中的隐式类型(基本上是下面第一个 ? 所隐含的类型)。

public class Foo<BAR extends Bar<?>> {
public void t(BAR x) {
List l = new ArrayList();
Object baz = x.makeBaz(null);
l.add(baz);
x.setBazList(l);
}
}

public interface Bar<BAZ extends Number> {
public BAZ makeBaz(Object arg1);
public List<BAZ> getBazList();
public void setBazList(List<BAZ> baz);
}

例如在上面的代码中是否可以替换行

    List l = new ArrayList();
Object baz = x.makeBaz(null);

使用泛型的东西?

我宁愿避免写:

public class Foo<BAZ extends Number, BAR extends Bar<BAZ>> {
public void t(BAR x) {
List<BAZ> l = new ArrayList<BAZ>();
BAZ baz = x.makeBaz(null);
l.add(baz);
}
}

因为在任何派生类的声明中强制这样做感觉不自然。

我知道上面的内容有点做作,但它比尝试显示我正在查看的实际代码要简单得多。

最佳答案

我想主要的问题是你需要以某种方式强制你从 x.makeBaz() 中得到的类型与您给x.setBazList(l)的列表的类型参数相同, 如果你只使用 ?你失去了执行能力,所以你需要一个泛型类型参数。但从某种意义上说,类型参数只在那几行中“本地”需要,类的其余部分不需要知道。

您可以使用类型参数 BAZ仅参数化方法而不是类:

public <BAZ extends Number> void t2(Bar<BAZ> x) {
List<BAZ> l = new ArrayList<BAZ>();
BAZ baz = x.makeBaz(null);
l.add(baz);
x.setBazList(l);
}

这用于本地化我们需要这个临时类型变量的代码区域 BAZ .请注意,此方法的签名实际上是 public void t2(Bar<?> x) ,即外部不需要知道这个 BAZ .

现在当然这个方法现在接受所有Bar<anything>而不仅仅是 BAR .如果这是一个问题,您可以“包装”上述方法。我们没有像以前一样的问题,因为所有 BAZ t2() 里面已经装了东西,它需要一个 Bar<anything> , 所以我们可以安全地传递 BAR :

public void t(BAR x) {
t2(x);
}

我同意这似乎有点迂回。也许其他人会想出更好的方法。

关于java - 我可以简化这个 Java 泛型层次结构吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/856717/

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