通配符上的Java语言规范

时间:2016-02-23 12:25:12

标签: java generics wildcard jls unbounded-wildcard

我正在阅读这个link(第4章类型,值和变量)并且不明白以下几点:

  

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

  

通配符是存在类型的受限形式。给定泛型类型声明G,G大致类似于Some X&lt;: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>声明保证了任何类型参数(即使它是?通配符)始终是&#34;至少&#34;类型为B

(与此相反:如果声明仅为G<T>,则从g.get()获取的类型只能是Object类型

这种关系被描述为&#34; 大致相似的&#34;到类型理论符号。您可以想象这样说:如果声明是G<T extends B>,并且您使用类型G<?>,那么大致(!)意味着:存在类型X extends B和{ {1}}此处代表此(未知)类型?

旁白:请注意,这也指Insersection Types。如果您将类声明为X,那么语句

class G<T extends B & Runnable>

都有效。

* &#34;运气不好&#34;格式化指的是该段的源代码实际上是

的事实
B b = g.get();
Runnable x = g.get();

更清楚地说明了一些&#34; Some&#34;已经是正式定义的类型的一部分......

答案 1 :(得分:0)

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

相关问题