Specification update: diamond and explicit generic constructor argument no longer supported
Bruce Chapman
brucechapman at paradise.net.nz
Mon May 9 01:16:13 PDT 2011
On 7/05/2011 11:17 a.m., Rémi Forax wrote:
> On 05/07/2011 01:10 AM, Neal Gafter wrote:
>> I've never seen a generic constructor outside of test code, so it is
>> hard to imagine anyone finding this restriction burdensome.
> I have used one once, it wanted to use a parametrized class
> that inherits from Exception, because it was not possible,
> I, at least, check that the two arguments of the constructor were coherent.
>
> Rémi
>
So I would suppose that inference would work fine in that case, and you
don't need to use an explicit type argument.
Bruce
>> On Fri, May 6, 2011 at 3:50 PM,<joe.darcy at oracle.com> wrote:
>>> Hello.
>>>
>>> To address an issue in the specification, the JSR 334 expert group has
>>> decided to ban the combination of diamond together with explicit
>>> constructor type arguments. For background, a constructor can have two
>>> sets of type arguments. In a parameterized class, constructors can have
>>> type arguments corresponding to the class's type parameters. This is the
>>> common case and the type arguments appear to the right of the class name
>>> and "new" as in "new ArrayList<String>()". In addition, if a constructor
>>> declares its very own type parameters (which can be done whether or not
>>> the enclosing class is parameterized), then those type arguments appear
>>> between the "new" token and the class name as in "new<Integer>
>>> ConstructorWithTypeParameter(Integer.valueOf(42))".
>>>
>>> As with generic methods, the type arguments of generic constructors are
>>> usually inferred and not explicitly passed. However, generic
>>> constructors are much less common than generic methods.
>>>
>>> After the specification change, using diamond to infer the class type
>>> parameters but explicitly passing the constructor type parameters is
>>> forbidden. However, the other three combinations of explicitly passing
>>> type arguments versus inferring them are supported, as shown in the
>>> table below.
>>>
>>> class Foo<T extends Number> {
>>> <S extends T> Foo(S s) {super();}
>>> }
>>>
>>> Class C'tor Supported Example
>>> Explicit Explicit Yes new<Integer> Foo<Number>(null);
>>> Explicit Inferred Yes new Foo<>(null);
>>> Inferred Explicit No new<Integer> Foo<>(null); // compile
>>> error
>>> Inferred Inferred Yes new Foo<>(null);
>>>
>>> The substitution that was used to formally describe the semantics of
>>> diamond did not fully propagate constraints if there was a typing
>>> relationship between the type parameters of the constructor and the type
>>> parameters of the class. Lifting the imposed restriction on the banned
>>> combination of explicit and inferred type arguments can be revisited in
>>> future work in the context of broader type inference getting added to
>>> the Java language.
>>>
>>> Since generic constructors are so uncommon, adding this restriction
>>> about combining them with diamond should have little effect to most
>>> programs. For example, none of the uses of diamond in the JDK had to be
>>> updated as a result of this change. A changeset implementing this
>>> specification change has been pushed [1] and will appear in subsequent
>>> promoted builds of JDK 7.
>>>
>>> -Joe
>>>
>>> [1] http://hg.openjdk.java.net/jdk7/tl/langtools/rev/4caf17560ae0
>>>
>>>
>
>
More information about the coin-dev
mailing list