【问题标题】:Java language specification on wildcards关于通配符的 Java 语言规范
【发布时间】:2016-02-23 12:25:12
【问题描述】:

我正在浏览这个link(第 4 章。类型、值和变量)并且不明白以下几点:

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

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

提前致谢。

【问题讨论】:

    标签: java generics wildcard jls unbounded-wildcard


    【解决方案1】:

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

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

    这基本上说G 的类型参数是B 的任何子类型。这是总是的情况,即使你没有明确地说出来。

    考虑以下 sn-p,希望能说明这一点:

    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&lt;T extends B&gt;声明 保证任何类型参数(即使它是? 通配符)总是“至少”类型为B

    (与此相反:如果声明只有G&lt;T&gt;,那么从g.get()获得的类型将只有Object类型)


    这种关系被描述为与类型理论符号“大致相似”。你大概可以这样想象:如果声明是G&lt;T extends B&gt;,而你使用了G&lt;?&gt;类型,那么这大致(!)的意思是:存在一个类型X extends B,而这里的?代表这个(未知)输入X


    旁白:请注意,这也指的是Insersection Types。如果你将类声明为class G&lt;T extends B &amp; Runnable&gt;,那么语句

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

    两者都有效。


    *“倒霉”的格式是指这一段的源代码实际上是这样写的

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        最近更新 更多