Java language specification on wildcards

流过昼夜 提交于 2019-12-10 19:31:22

问题


I am going through this link (Chapter 4. Types, Values, and Variables) and did not understand below point:

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>.

I appreciate if you provide good example to understand above point clearly.

Thanks in advance.


回答1:


The wording and formatting of this statement are a bit unlucky*. The link in the answer by Maouven actually covers the general topic pretty well, but one can try to focus on the particular case of Java and Wildcards here:

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

This basically says that the type parameter of the G is any subtype of B. And this is always the case, even when you don't say it explicitly.

Consider the following snippet, which hopefully illustrates the point:

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();
    }
}

The object that you obtain by calling g.get() is of type B, because the declaration of G<T extends B> guarantees that any type parameter (even if it is the ? wildcard) always be "at least" of type B.

(In contrast to that: If the declaration only was G<T>, then the type obtained from g.get() would only be of type Object)


The relationship is described as "roughly analogous" to the type theoretic notation. You can probably imagine this as saying: If the declaration is G<T extends B>, and you use the type G<?>, then this roughly (!) means: There exists a type X extends B, and the ? here stands for this (unknown) type X.


An aside: Note that this also refers to Insersection Types. If you declared the class as class G<T extends B & Runnable>, then the statements

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

would both be valid.


* The "unlucky" formatting referred to the fact that the source code of this paragraph actually reads

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

making clearer that the word "Some" already is part of the type that is being defined there formally...




回答2:


Wildcards are a restricted form of existential types, in the way they incorporate the principle of existential types in Java. You can refer to the link here which provide explanatory examples: What is an existential type?



来源:https://stackoverflow.com/questions/35577532/java-language-specification-on-wildcards

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!