aboutsummaryrefslogtreecommitdiffstats
path: root/tests/bugs183/442425/MyAnnotatedController.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/bugs183/442425/MyAnnotatedController.java')
-rw-r--r--tests/bugs183/442425/MyAnnotatedController.java63
1 files changed, 35 insertions, 28 deletions
diff --git a/tests/bugs183/442425/MyAnnotatedController.java b/tests/bugs183/442425/MyAnnotatedController.java
index fab43b835..cafe5bcbc 100644
--- a/tests/bugs183/442425/MyAnnotatedController.java
+++ b/tests/bugs183/442425/MyAnnotatedController.java
@@ -1,37 +1,44 @@
-package de.scrum_master.app;
-
import java.lang.reflect.Method;
@EntityController
public class MyAnnotatedController<T> {
- public void doSomething() {
- System.out.println("Doing something");
- }
+ public void doSomething() {
+ System.out.println("Doing something");
+ }
- public static void main(String[] args) {
- // Use class type directly so as to call its method
- MyAnnotatedController<String> annotatedTextController = new MyAnnotatedController<>();
- annotatedTextController.doSomething();
+ public static void main(String[] args) {
+ // Use class type directly so as to call its method
+ MyAnnotatedController<String> annotatedTextController = new MyAnnotatedController<>();
+ annotatedTextController.doSomething();
- // Print all declared methods (should also show interface methods introduced via ITD)
- for (Method method : annotatedTextController.getClass().getDeclaredMethods()) {
- if (!method.getName().startsWith("ajc$"))
- System.out.println(method);
- }
+ // Print all declared methods (should also show interface methods introduced via ITD)
+ for (Method method : annotatedTextController.getClass().getDeclaredMethods()) {
+ if (!method.getName().startsWith("ajc$"))
+ System.out.println(method);
+ }
- // Prove that class type is compatible with interface type
- //IEntityController<String> entityTextController = annotatedTextController;
- //entityTextController.setEntity("foo");
- // Would not work here because generic interface type is type-safe:
- // entityNumberController.setEntity(123);
- //System.out.println("Entity value = " + entityTextController.getEntity());
+ // Prove that class type is compatible with interface type
+ //
+ // NOTE: As explained in https://bugs.eclipse.org/bugs/show_bug.cgi?id=442425#c2, @DeclareParents will add the
+ // raw form of the parent to the target class, not the generic one. Therefore, the additional cast is necessary.
+ // Otherwise, AJC would throw:
+ // Type mismatch: cannot convert from MyAnnotatedController<String> to IEntityController<String>
+ IEntityController<String> entityTextController = (IEntityController<String>) annotatedTextController;
+ entityTextController.setEntity("foo");
+ // Would not work here because generic interface type is type-safe:
+ // entityNumberController.setEntity(123);
+ System.out.println("Entity value = " + entityTextController.getEntity());
- // Create another object and directly assign it to interface type
- //IEntityController<Integer> entityNumberController = new MyAnnotatedController<>();
- //entityNumberController.setEntity(123);
- // Would not work here because generic interface type is type-safe:
- // entityNumberController.setEntity("foo");
- //System.out.println("Entity value = " + entityNumberController.getEntity());
- }
+ // Create another object and directly assign it to interface type.
+ //
+ // NOTE: As explained in https://bugs.eclipse.org/bugs/show_bug.cgi?id=442425#c2, @DeclareParents will add the
+ // raw form of the parent to the target class, not the generic one. Therefore, the additional cast is necessary.
+ // Otherwise, AJC would throw:
+ // Cannot infer type arguments for MyAnnotatedController<>
+ IEntityController<Integer> entityNumberController = (IEntityController<Integer>) new MyAnnotatedController<>();
+ entityNumberController.setEntity(123);
+ // Would not work here because generic interface type is type-safe:
+ // entityNumberController.setEntity("foo");
+ System.out.println("Entity value = " + entityNumberController.getEntity());
+ }
}
-