-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
22, 23
-
generic
-
generic
ADDITIONAL SYSTEM INFORMATION :
Java: openjdk 21.0.1 2023-10-17 LTS OpenJDK Runtime Environment Temurin-21.0.1+12 (build 21.0.1+12-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.1+12 (build 21.0.1+12-LTS, mixed mode, sharing)
OS: Windows 11 on x86-64
A DESCRIPTION OF THE PROBLEM :
If a compact constructor is added to a record, that record's reflective Constructor object loses the generic type info on its Parameter objects.
See also: https://github.com/adoptium/adoptium-support/issues/1025
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the attached JUnit5 test case.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
All tests pass.
ACTUAL -
The "compact" test fails. The other tests pass.
---------- BEGIN SOURCE ----------
import java.lang.reflect.Type;
import java.util.List;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class RecordParameterTest {
public static List<String> fieldWithExpectedType;
public static Type expected;
@BeforeAll
static void determineExpectedType() throws NoSuchFieldException {
expected = RecordParameterTest.class.getField("fieldWithExpectedType").getGenericType();
}
record ImplicitConstructor(List<String> arg){}
record CompactConstructor(List<String> arg) {
CompactConstructor { }
}
record CanonicalConstructor(List<String> arg) {
CanonicalConstructor(List<String> arg) {
this.arg = arg;
}
}
@Test
void implicit() {
assertEquals(expected, firstConstructorParameterType(ImplicitConstructor.class));
}
@Test
void compact() {
assertEquals(expected, firstConstructorParameterType(CompactConstructor.class));
}
@Test
void canonical() {
assertEquals(expected, firstConstructorParameterType(CanonicalConstructor.class));
}
static Type firstConstructorParameterType(Class<?> c) {
return c.getDeclaredConstructors()[0].getParameters()[0].getParameterizedType();
}
}
---------- END SOURCE ----------
FREQUENCY : always
Java: openjdk 21.0.1 2023-10-17 LTS OpenJDK Runtime Environment Temurin-21.0.1+12 (build 21.0.1+12-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.1+12 (build 21.0.1+12-LTS, mixed mode, sharing)
OS: Windows 11 on x86-64
A DESCRIPTION OF THE PROBLEM :
If a compact constructor is added to a record, that record's reflective Constructor object loses the generic type info on its Parameter objects.
See also: https://github.com/adoptium/adoptium-support/issues/1025
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the attached JUnit5 test case.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
All tests pass.
ACTUAL -
The "compact" test fails. The other tests pass.
---------- BEGIN SOURCE ----------
import java.lang.reflect.Type;
import java.util.List;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class RecordParameterTest {
public static List<String> fieldWithExpectedType;
public static Type expected;
@BeforeAll
static void determineExpectedType() throws NoSuchFieldException {
expected = RecordParameterTest.class.getField("fieldWithExpectedType").getGenericType();
}
record ImplicitConstructor(List<String> arg){}
record CompactConstructor(List<String> arg) {
CompactConstructor { }
}
record CanonicalConstructor(List<String> arg) {
CanonicalConstructor(List<String> arg) {
this.arg = arg;
}
}
@Test
void implicit() {
assertEquals(expected, firstConstructorParameterType(ImplicitConstructor.class));
}
@Test
void compact() {
assertEquals(expected, firstConstructorParameterType(CompactConstructor.class));
}
@Test
void canonical() {
assertEquals(expected, firstConstructorParameterType(CanonicalConstructor.class));
}
static Type firstConstructorParameterType(Class<?> c) {
return c.getDeclaredConstructors()[0].getParameters()[0].getParameterizedType();
}
}
---------- END SOURCE ----------
FREQUENCY : always
- duplicates
-
JDK-8320575 generic type information lost on mandated parameters of record's compact constructors
-
- Closed
-