JDK-8038994 : AnnotatedType.getType() of a TypeVariable boundary without annotations return null
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang:reflect
  • Affected Version: 8
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • OS: linux
  • CPU: x86_64
  • Submitted: 2014-04-01
  • Updated: 2014-12-22
  • Resolved: 2014-05-16
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8 JDK 9
8u20Fixed 9 b15Fixed
Description
FULL PRODUCT VERSION :
1.8.0-b132

ADDITIONAL OS VERSION INFORMATION :
Linux ivostmaina 3.13.6-gentoo #1 SMP Thu Mar 20 02:22:16 CET 2014 x86_64 AMD FX(tm)-8350 Eight-Core Processor AuthenticAMD GNU/Linux

A DESCRIPTION OF THE PROBLEM :
The getAnnotatedBounds(); method of the TypeVariable interface may return AnnotatedType instances where the getType(); method returns null.

class MyClass<T> {
}

TypeVariable<Class<MyClass>> tv = MyClass.class.getTypeParameters()[0];
tv.getAnnotatedBounds()[0].getType() is NULL

I expect that
tv.getAnnotatedBounds()[0].getType() equals tv.getBounds()[0]


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
	@Test
	public void java8_typevariable_bug_or_not1() {

		class MyClass<T> {

		}

		assertEquals(1, MyClass.class.getTypeParameters().length);

		@SuppressWarnings("rawtypes")
		TypeVariable<Class<MyClass>> tv = MyClass.class.getTypeParameters()[0];
		assertNotNull(tv);

		Type[] bs = tv.getBounds();
		assertNotNull(bs);
		assertEquals(1, bs.length);

		AnnotatedType[] abs = tv.getAnnotatedBounds();
		assertNotNull(abs);
		assertEquals(1, abs.length);

		Type t = bs[0];
		assertNotNull(t);
		assertEquals(Object.class, t);

		AnnotatedType at = abs[0];
		assertNotNull(at);
		assertNotNull(at.getType()); // FAILS HERE

		assertEquals(t, at);
	}

	@Test
	public void java8_typevariable_bug_or_not2() {

		class MyClass<T extends Number> {

		}

		assertEquals(1, MyClass.class.getTypeParameters().length);

		@SuppressWarnings("rawtypes")
		TypeVariable<Class<MyClass>> tv = MyClass.class.getTypeParameters()[0];
		assertNotNull(tv);

		Type[] bs = tv.getBounds();
		assertNotNull(bs);
		assertEquals(1, bs.length);

		AnnotatedType[] abs = tv.getAnnotatedBounds();
		assertNotNull(abs);
		assertEquals(1, abs.length);

		Type t = bs[0];
		assertNotNull(t);
		assertEquals(Number.class, t);

		AnnotatedType at = abs[0];
		assertNotNull(at);
		assertNotNull(at.getType()); // FAILS HERE

		assertEquals(t, at);
	}
---------- END SOURCE ----------