gpt4 book ai didi

java - 为什么在有界通配符泛型中不能有多个接口(interface)?

转载 作者:IT老高 更新时间:2023-10-28 13:51:44 24 4
gpt4 key购买 nike

我知道 Java 的泛型类型有各种违反直觉的属性。特别是我不明白的一个,我希望有人可以向我解释。为类或接口(interface)指定类型参数时,可以绑定(bind)它,使其必须实现多个接口(interface),public class Foo<T extends InterfaceA & InterfaceB> .但是,如果您要实例化一个实际对象,这将不再起作用。 List<? extends InterfaceA>很好,但是 List<? extends InterfaceA & InterfaceB>无法编译。考虑以下完整的片段:

import java.util.List;

public class Test {

static interface A {
public int getSomething();
}

static interface B {
public int getSomethingElse();
}

static class AandB implements A, B {
public int getSomething() { return 1; }
public int getSomethingElse() { return 2; }
}

// Notice the multiple bounds here. This works.
static class AandBList<T extends A & B> {
List<T> list;

public List<T> getList() { return list; }
}

public static void main(String [] args) {
AandBList<AandB> foo = new AandBList<AandB>(); // This works fine!
foo.getList().add(new AandB());
List<? extends A> bar = new LinkedList<AandB>(); // This is fine too
// This last one fails to compile!
List<? extends A & B> foobar = new LinkedList<AandB>();
}
}

似乎 bar 的语义应该是明确定义的——我想不出允许两种类型的交集而不仅仅是一种类型的任何类型安全性损失。不过我敢肯定有一个解释。有人知道是什么吗?

最佳答案

有趣的是,界面 java.lang.reflect.WildcardType看起来它支持通配符 arg 的上限和下限;每个可以包含多个边界

Type[] getUpperBounds();
Type[] getLowerBounds();

这远远超出了语言允许的范围。源码中有隐藏注释

// one or many? Up to language spec; currently only one, but this API
// allows for generalization.

界面的作者似乎认为这是一个偶然的限制。

您的问题的固定答案是,泛型已经太复杂了;增加更多复杂性可能会成为最后一根稻草。

要允许通配符有多个上限,必须仔细检查规范并确保整个系统仍然有效。

我知道的一个问题是类型推断。当前的推理规则根本无法处理交集类型。没有减少约束的规则 A&B << C .如果我们将其简化为

    A<<C 
or
A<<B

任何当前的推理引擎都必须进行大修才能允许这种 fork 。但真正严重的问题是,这允许多种解决方案,但没有理由偏爱其中一种。

但是,推理对于类型安全并不是必不可少的;在这种情况下,我们可以简单地拒绝推断,并要求程序员显式填写类型参数。因此,推理困难并不是反对拦截类型的有力论据。

关于java - 为什么在有界通配符泛型中不能有多个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643241/

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