> Here comes the parallel with Integer, the way we use Integer currently is, i 
> believe, the way we should use V*. It's fine to use V* as a type argument, 
> it's fine to use it in a field if you want the reference semantics or a null 
> value. It's not fine to use Integer as parameter of a method. That's why i 
> think V* should not have the fully crippled semantics, but a kind of 
> in-between.

I think there are two points of disagreement here:

1. The meaning of “not fine”.  

2. Whether the language should attempt to make such things impossible.  

So, while I agree that it is _generally_ a smell to write APIs that have 
Integer as parameter or return types, but that doesn’t mean that _any_ such use 
is an error, and I certainly don’t think that Integer should not be denotable 
as a parameter type.  

Here’s an example of how a param/return type of Integer arises naturally:

    interface Foo<T> { T mangle(T t); }

    class C implements Foo<Integer> { 
        Integer mangle(Integer i) { … }
    }

If it’s OK to say Foo<Integer>, and it’s OK for a class to specialize the 
generic type arguments of its super types, then it has to be OK to use Integer 
as a parameter or return type.  Similarly, what if Foo was:

    interface Foo<T> { 
         void process(Consumer<T> c);
    }

clients of C might well want to explicitly type their lambdas as (Integer i) -> 
…. 

Now, s/Integer/V?/:

    class D implements Foo<V?> { 
        V? mangle(V? v) { … }
    }

Same argument.  While I wouldn’t encourage people to write APIs that make heavy 
use of V?, the natural flow of generic types into signatures will occasionally 
make it happen, and that’s OK.  


Reply via email to