gpt4 book ai didi

关于通配符的 Java 语言规范

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:51 27 4
gpt4 key购买 nike

我正在经历这个link (第 4 章类型、值和变量)并且不理解以下几点:

The relationship of wildcards to established type theory is an interesting one, which we briefly allude to here. Wildcards are a restricted form of existential types. Given a generic type declaration G<T extends B>, G<?> is roughly analogous to Some X <: B. G<X>.

如果您能提供很好的例子来清楚地理解上述观点,我将不胜感激。

提前致谢。

最佳答案

这句话的措辞和格式有点不吉利*answer by Maouven 中的链接实际上很好地涵盖了一般主题,但可以尝试在此处关注 Java 和通配符的特殊情况:

Wildcards are a restricted form of existential types. Given a generic type declaration G, G is roughly analogous to Some X <: B. G.

这基本上是说 G 的类型参数是 B 的任何子类型.这总是是这种情况,即使您没有明确说明也是如此。

考虑以下片段,它有望说明这一点:

class B { } 
class G<T extends B>
{
T get() { return null; }
}

public class Example
{
public static void main(String[] args)
{
G<?> g = null;

// This works, even though "G<?>" seemingly does not say
// anything about the type parameter:
B b = g.get();
}
}

通过调用 g.get() 获得的对象类型为 B , 因为 G<T extends B>声明保证任何类型参数(即使它是 ? 通配符)总是“至少”属于 B 类型.

(相反:如果声明只有 G<T> ,那么从 g.get() 得到的类型也只会是 Object 类型)


这种关系被描述为与类型论符号“大致类似”。您可能会想像这样说:如果声明是 G<T extends B> ,并且您使用类型 G<?> ,那么这大致(!)意味着:存在一个类型 X extends B , 和 ?这里代表这个(未知)类型 X .


旁白:请注意,这也指代 Insersection Types .如果您将类声明为 class G<T extends B & Runnable> , 然后是语句

B b = g.get();
Runnable x = g.get();

都有效。


* “不幸”的格式指的是本段的源代码实际读取的事实

    ... is roughly analogous to <span class="type">Some <span class="type">X</span> ...

更清楚地表明“Some”这个词已经是在那里正式定义的类型的一部分......

关于关于通配符的 Java 语言规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35577532/

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