| Other |
|---|
| tbdUnresolved |
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
From: Neal Gafter <###@###.###>
Subject: javac bug? spec bug? (array type as a bound)
Date: Fri, 22 Sep 2006 12:11:29 -0700
Javac rejects this:
class X<T extends Object[]> {}
While examining JLS3 to see if it is allowed, I find 3.3 says
Type variables have an optional bound, T & I1 ... In. The bound consists of either a type variable, or a class or interface type T possibly followed by further interface types I 1 , ..., In. ...
According to 4.3, array types are not class types, so javac is correct. However, JLS does allow a type argument to be an array type:
interface Foo<T> {}
class Main {
public static void main(String[] args) {
Foo<Object[]> f = null;
}
}
Here's the problem: the capture conversion as specified will infer a type variable with an array as a bound, even though no such type exists according to 3.3:
interface Foo<T> {}
class Main {
static <T> Foo<? extends T> foo(T t) { return null; }
public static void main() {
int x = foo(new Integer[0]);
}
}
// X.java: incompatible types
// found : Foo<capture of ? extends java.lang.Integer[]>
// required: int
// int x = foo(new Integer[0]);
// ^
Further, there are various places in the spec (particularly 15.12.2.7) that say things like "If X is a type variable with an upper bound that is an array type...", even though such bounds are forbidden by 3.3.
I recommend that the JLS and javac uniformly allow array types as bounds for type variables in the surface syntax.
|