주석 처리 중 불분명한 오류 ※ 미해결
아는 범위 내에 무슨 잘못을 적어라.
컨디션
Javaopenjdk 10.0.2
GradleGradle 4.10
Eclipse4.8.0 (Photon)
※ Pleiades
이루어지다
폴더 구성|-settings.gradle
|-build.gradle
|-foo/
| `-src/main/java/
| `-foo/
| |-Foo.java
| |-ConcreteClass.java
| |-MyAnnotation.java
| `-MyInterface.java
|
`-bar/
`src/main/
|-java/
| `-bar/
| `-MyProcessor.java
`-resources/
`-META-INF/services/
`-javax.annotation.processing.Processor
폴더 구성
|-settings.gradle
|-build.gradle
|-foo/
| `-src/main/java/
| `-foo/
| |-Foo.java
| |-ConcreteClass.java
| |-MyAnnotation.java
| `-MyInterface.java
|
`-bar/
`src/main/
|-java/
| `-bar/
| `-MyProcessor.java
`-resources/
`-META-INF/services/
`-javax.annotation.processing.Processor
foo
, bar
의 다중 항목bar
주석 처리를 실현했고 foo
주석 처리를 이용했다package bar;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileObject;
public class MyProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (!annotations.isEmpty()) {
try {
JavaFileObject javaFileObject = this.processingEnv.getFiler().createSourceFile("foo.AutoGeneratedClass");
try (BufferedWriter writer = new BufferedWriter(javaFileObject.openWriter())) {
writer.write(
"package foo;\n" +
"import foo.MyInterface;\n" +
"public class AutoGeneratedClass implements MyInterface {}"
);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
return true;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latest();
}
@Override
public Set<String> getSupportedAnnotationTypes() {
return Set.of("foo.MyAnnotation");
}
}
MyAnnotation
초대 처리를 목표로 하는 주석 처리 실현MyInterface
인터페이스를 실현하는 클래스 자동 생성AutoGeneratedClass
package foo;
public interface MyInterface {}
package foo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
Class<? extends MyInterface> clazz();
}
clazz
소자 수용MyInterface
을 상한Class
으로 하는 실례package foo;
public class ConcreteClass extends AutoGeneratedClass {}
AutoGeneratedClass
으로 생성package foo;
@MyAnnotation(clazz=ConcreteClass.class)
public class Foo {}
실제 사용
ConcreteClass
의 클래스MyAnnotation
요소에 설정clazz
실례ConcreteClass
분류도
발생한 사건
이걸 컴파일하면 아래가 이렇게 돼요.> gradle :foo:compileJava
> Task :foo:compileJava FAILED
...\foo\src\main\java\foo\ConcreteClass.java:3: エラー: シンボルを見つけられません
public class ConcreteClass extends AutoGeneratedClass {
^
シンボル: クラス AutoGeneratedClass
...\foo\src\main\java\foo\Foo.java:3: エラー: 不適合な型: Class<ConcreteClass>をClass<? extends MyInterface>に変換できません:
@MyAnnotation(clazz=ConcreteClass.class)
^
エラー2個
> gradle :foo:compileJava
> Task :foo:compileJava FAILED
...\foo\src\main\java\foo\ConcreteClass.java:3: エラー: シンボルを見つけられません
public class ConcreteClass extends AutoGeneratedClass {
^
シンボル: クラス AutoGeneratedClass
...\foo\src\main\java\foo\Foo.java:3: エラー: 不適合な型: Class<ConcreteClass>をClass<? extends MyInterface>に変換できません:
@MyAnnotation(clazz=ConcreteClass.class)
^
エラー2個
Class
AutoGeneratedClass
의 컴파일 실패다방면으로 시도하다
Eclipse였으면 안 일어났을 거예요.
ConcreteClass
명령으로만 컴파일하려고 했지만 오류가 발생했다지정된 매개변수의 상한선을 중지하면 더 이상 발생하지 않습니다.
MyAnnotation.java
package foo;
...
public @interface MyAnnotation {
- Class<? extends MyInterface> clazz();
+ Class<?> clazz();
}
javac
의MyAnnotation
요소 중 지정된clazz
의 상한선컴파일 결과
> gradle :foo:compileJava
...
BUILD SUCCESSFUL in 3s
상한선을 자동으로 생성된 클래스로 설정할 때 오류가 발생하지 않습니다
MyAnnotation.java
package foo;
...
public @interface MyAnnotation {
- Class<? extends MyInterface> clazz();
+ Class<? extends AutoGeneratedClass> clazz();
}
MyInterface
의 상한선을 clazz
에서 자동생성류MyInterface
컴파일 결과
> gradle :foo:compileJava
...
BUILD SUCCESSFUL in 3s
clazz를 자동으로 생성된 클래스로 지정해도 오류가 발생하지 않습니다
Foo.java
package foo;
- @MyAnnotation(clazz=ConcreteClass.class)
+ @MyAnnotation(clazz=AutoGeneratedClass.class)
public class Foo {}
AutoGeneratedClass
의 한 측이 MyAnnotation
의 상한 지정으로 설정...
BUILD SUCCESSFUL in 4s
ConcertClass 자체에 의존하는 것은 문제가 없습니다.
Foo.java
package foo;
- @MyAnnotation(clazz=ConcreteClass.class)
+ @MyAnnotation
public class Foo {
+ private Class<?> clazz = ConcreteClass.class;
}
요소 삭제
Class<? extends MyInterface>
MyAnnotation
clazz
ConcreteClass
도 참고> gradle :foo:compileJava
BUILD SUCCESSFUL in 3s
비처리 객체와 근사하게 참조할 수 없습니다.
OtherAnnotation.java
package foo;
...
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface OtherAnnotation {
Class<? extends MyInterface> clazz();
}
ConcreteClass.class
와 같은 정의MyAnnotation
Foo.java
package foo;
- @MyAnnotation(clazz=ConcreteClass.class)
+ @MyAnnotation
+ @OtherAnnotation(clazz=ConcreteClass.class)
public class Foo {}
OtherAnnotation.java
에 Foo
OtherAnnotation
한 측의 MyAnnotation
요소가 삭제되었습니다> gradle :foo:compileJava
> Task :foo:compileJava FAILED
...\foo\src\main\java\foo\ConcreteClass.java:3: エラー: シンボルを見つけられません
public class ConcreteClass extends AutoGeneratedClass {
^
シンボル: クラス AutoGeneratedClass
...\foo\src\main\java\foo\Foo.java:4: エラー: 不適合な型: Class<ConcreteClass>をClass<? extends MyInterface>に変換できません:
@OtherAnnotation(clazz=ConcreteClass.class)
^
エラー2個
clazz
때와 동일한 오류 발생주석 처리와 무관한 곳에 써도 안 된다
OtherClass.javapackage foo;
@OtherAnnotation(clazz=ConcreteClass.class)
public class OtherClass {}
Foo.javapackage foo;
- @MyAnnotation(clazz=ConcreteClass.class)
+ @MyAnnotation
public class Foo {}
package foo;
@OtherAnnotation(clazz=ConcreteClass.class)
public class OtherClass {}
package foo;
- @MyAnnotation(clazz=ConcreteClass.class)
+ @MyAnnotation
public class Foo {}
MyAnnotation
이전과 동일OtherAnnotation
에서 사용OtherClass
> Task :foo:compileJava FAILED
...\foo\src\main\java\foo\ConcreteClass.java:3: エラー: シンボルを見つけられません
public class ConcreteClass extends AutoGeneratedClass {
^
シンボル: クラス AutoGeneratedClass
...\foo\src\main\java\foo\OtherClass.java:3: エラー: 不適合な型: Class<ConcreteClass>をClass<? extends MyInterface>に変換できません:
@OtherAnnotation(clazz=ConcreteClass.class)
^
エラー2個
@OtherAnnotation(clazz=ConcreteClass.class)
할 경우 오류가 발생할 수 있음증상을 정리하다
여러 가지 시도의 결과를 정리하면 다음 조건을 만족할 때 틀릴 것 같다?
ConcreteClass.class
Class
의 실례를 수신한 소자에 대한 정의Class
결론
잘 모르겠어요.
Reference
이 문제에 관하여(주석 처리 중 불분명한 오류 ※ 미해결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/opengl-8080/items/2bbcc914d1db91d47221
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(주석 처리 중 불분명한 오류 ※ 미해결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/opengl-8080/items/2bbcc914d1db91d47221텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)