Details
-
Bug
-
Resolution: Fixed
-
P4
-
8
-
b08
-
Verified
Description
According to the Java spec and Class.getSuperclass(), interfaces don't have java.lang.Object as their super class.
Types.directSupertypes( TypeMirror of an interface ) incorrectly returns java.lang.Object as the direct super type.
------ Processor------
import java.util.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import javax.lang.model.util.*;
import static javax.lang.model.SourceVersion.*;
import static javax.lang.model.type.TypeKind.*;
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(RELEASE_7)
public class Processor extends AbstractProcessor {
public void init(ProcessingEnvironment penv) {
super.init(penv);
}
public boolean process(Set<? extends TypeElement> typeElementSet,
RoundEnvironment renv) {
for ( TypeElement typeElement : typeElementSet )
{
Set<? extends Element> elements = renv.getElementsAnnotatedWith( typeElement );
for ( Element element : elements )
{
TypeMirror type = element.asType();
System.out.println( "Type: " + type.toString() );
List<? extends TypeMirror> supers = processingEnv.getTypeUtils().directSupertypes( type );
for ( TypeMirror superClass : supers )
System.out.println( "Super class: " + superClass.toString() );
}
}
return true ;
}
}
-------------- Interface ---
@SuppressWarnings("all")
class Interface1 {}
--------------------
javac -classpath . Processor.java
javac -classpath . -processor Processor Interface1.java
Will print:
Type: Interface1
Super class: java.lang.Object
Types.directSupertypes( TypeMirror of an interface ) incorrectly returns java.lang.Object as the direct super type.
------ Processor------
import java.util.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import javax.lang.model.util.*;
import static javax.lang.model.SourceVersion.*;
import static javax.lang.model.type.TypeKind.*;
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(RELEASE_7)
public class Processor extends AbstractProcessor {
public void init(ProcessingEnvironment penv) {
super.init(penv);
}
public boolean process(Set<? extends TypeElement> typeElementSet,
RoundEnvironment renv) {
for ( TypeElement typeElement : typeElementSet )
{
Set<? extends Element> elements = renv.getElementsAnnotatedWith( typeElement );
for ( Element element : elements )
{
TypeMirror type = element.asType();
System.out.println( "Type: " + type.toString() );
List<? extends TypeMirror> supers = processingEnv.getTypeUtils().directSupertypes( type );
for ( TypeMirror superClass : supers )
System.out.println( "Super class: " + superClass.toString() );
}
}
return true ;
}
}
-------------- Interface ---
@SuppressWarnings("all")
class Interface1 {}
--------------------
javac -classpath . Processor.java
javac -classpath . -processor Processor Interface1.java
Will print:
Type: Interface1
Super class: java.lang.Object