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