Generics wildcard instantiation

后端 未结 1 2007
悲&欢浪女
悲&欢浪女 2020-12-19 06:31

I was reviewing someone else\'s code the other day and I came across a line that raised some concern. To simplify, say I have a generic Class A and an abstract Class B. Is t

相关标签:
1条回答
  • 2020-12-19 06:42

    Actually new A<? extends B>() does not compile. It has been consistently illegal since Java 5.

    But I guess your original example was something like new A<X<? extends B>>(). The latter is legal in recent versions of Java.

    The idea is, when instantiating an object, the value for type parameters can be any non-wildcard type. ? extends B is a wildcard type, so it is disallowed. But X<? extends B> is not a wildcard type, though it has a wildcard type as a component. So you can say legally call new A<X<? extends B>>().

    The rules makes sense if you think about it this way. Ultimately it is a byproduct of the more fundamental rule that a wildcard type like ? extends B cannot be the declared type of a field or variable. If A is defined as

    class A<T> {
        T value;
    }
    

    then the hypothetical new A<? extends B>().value would be a field declared of type ? extends B. Since that is illegal, so is the instantiation. But new A<X<? extends B>>() does not have that problem.

    0 讨论(0)
提交回复
热议问题