3

我正在浏览此链接(第 4 章。类型、值和变量),但不明白以下几点:

通配符与既定类型理论的关系是一个有趣的关系,我们在这里简要提及。通配符是存在类型的受限形式。Given a generic type declaration G<T extends B>, G<?> is roughly analogous to Some X <: B. G<X>.

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

提前致谢。

4

2 回答 2

1

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

通配符是存在类型的受限形式。给定一个泛型类型声明 G,G 大致类似于 Some X <: BG

这基本上说 的类型参数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()是 type B,因为声明保证G<T extends B>任何类型参数(即使它是?通配符)总是“至少”是 type B

(与此相反:如果声明仅为G<T>,则从中获得的类型g.get()将仅为 type Object


这种关系被描述为与类型理论符号“大致相似”。你大概可以想象这样的说法:如果声明是G<T extends B>,并且你使用了 type G<?>,那么这大致(!)的意思是:存在一个 type X extends B?here 代表这个(未知)类型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”这个词已经是正式定义的类型的一部分......

于 2016-02-24T15:45:05.877 回答
0

通配符是存在类型的一种受限形式,因为它们结合了 Java 中存在类型的原则。您可以参考此处提供解释性示例的链接: 什么是存在类型?

于 2016-02-23T13:45:13.460 回答