PROPOSAL: language support for JSR 292

John Rose John.Rose at Sun.COM
Fri May 1 14:46:29 PDT 2009


On Apr 29, 2009, at 8:14 PM, Neal Gafter wrote:

> These proposals appears to allow primitives and "void" to be used as  
> generic
> type arguments for this special class.  This use of the syntax has  
> nothing
> to do with generics.  Therefore, I believe it is an abuse of syntax.

It's an extension of the syntax, surely.  Let me try to unpack  
"abusive".

1.  Is it so ugly as to make it hard for programmers to learn?  I  
think not.  And I think the alternatives are more objectionable on  
that score.

2.  It is a bad extension if it interferes with existing or reasonable  
future uses of that syntax.  Will it interfere?  It does not now  
interfere since the JVM knows nothing about generics.

It might interfere if in some future Java world generics were to be  
reified (as in C#), and there were some notation for naming an  
implicit method (from within magic InvokeDynamic) equipped with type  
parameters.  To call such a method, we would need to give type  
arguments, and then we'd be embarrassed, since there is already a faux  
type parameter, the return type.  But, shaking those sorts of future  
scenarios around in my head, I can't come up with one that doesn't  
have a simple workaround, such as retaining InvokeDynamic in its  
limited capacity, and adding another more feature-ful source of  
implicit methods.

3. Is it not self-consistent?  In the current design a dynamic call  
with a type argument appears to the caller as if the referenced  
implicit method is parameterized by one type parameter, the return  
type.  (The JVM sees something different, naturally.)  The ability to  
specify <int>, and also to drop the type argument altogether, may be  
viewed as a sugar that means "the implicit method doesn't have a type  
parameter, instead it has int or Object as a fixed return type".  That  
looks consistent to me.

If in some future world we allow primitives somehow to be type  
arguments, then <int> could stop being sugar, but there would be no  
change of meaning.

Maybe there's some other objection (or meaning to "abusive") that  
still needs to be pointed out?

> If you're going to extend the language to support this special  
> InvokeDynamic
> class, you might as well just define language support for dynamic
> invocations directly without the magic class and generic  
> extensions.  I
> don't think the current spec for Dynamic fits with the current type  
> system.
> If you are adding special types like InvokeDynamic, I think they  
> must be
> reference types (i.e. a subtype of Object).  You should try to get  
> some
> information about what C# has done in this area for "dynamic", as I  
> believe
> it could be applied to Java and result in a clean solution.

The magic class, which really functions as an importable keyword, is  
the simplest way I know to allow the creation of invokedynamic sites.

A dynamic type, as in C#, would be another more useful way to create  
invokedynamic sites, but it would be several orders of magnitude more  
complex, because of its interactions with static typing, expressions,  
and the runtime support.

> By the way, now is a good time to add the boxed "Null" type, which  
> has no
> instances, referring to the type of null.  I don't think this  
> purpose is
> well served by using java.lang.Void.

Thanks for that push.   I hope that is possible, although touching  
java.lang.* is difficult.  I've thrown my lot in with Null; see the  
wiki.

If the planets do not align for the creation of java.lang.Void in JDK  
7, I suppose programmers can decide among themselves to use Void,  
along with an explicit cast, as (Void)null.  If that happens, we'll  
encourage MOP writers to recognize both Void and anything named  
"java.lang.Null" as interchangeable names for the null type.

-- John



More information about the coin-dev mailing list