2017-11-29 5 views
3

注釈プロセッサを作成していますが、特定のインターフェイスが実装されているかどうかを確認する必要があります。 質問Java Annotations Processor: Check if TypeMirror implements specific interfaceは、ジェネリックでないインターフェイスに対する回答を提供します。 しかし、StringComparable<String>を実装しているなど、汎用インターフェイスでは機能しません。また、isAssignableを使用するコードは機能しません。Java Annotation Processor:TypeMirrorが特定のジェネリックインターフェイスを実装しているかどうかを確認します。

TypeMirror tm = elementUtil.getTypeElement("java.lang.String").asType(); 
TypeMirror serializable = elementUtil.getTypeElement("java.io.Serializable").asType(); 
boolean isSerializable = typeUtil.isAssignable(tm, serializable); 
//here isSerializable is true 

しかし、このコードはしていません::

このコードは期待どおりに動作

TypeMirror tm = elementUtil.getTypeElement("java.lang.String").asType(); 
TypeMirror comparable = elementUtil.getTypeElement("java.lang.Comparable").asType(); 
boolean isComparable = typeUtil.isAssignable(tm, comparable); 
//here isComparable is false 

私が思うに、その理由は「同等の」TypeElementがジェネリックとして文字列で定義されていること、であること私はそれを回避する方法を知らない。

+0

あなたは 'tm'を定義しませんでした。 (スニペットの代わりに)コンパイルして実行できる完全なファイルを与えることは、他の人があなたの問題を理解し、あなたを助けるのに役立ちます。 – mernst

+0

tmはTypeMirror for Stringです。 – AreSo

答えて

1

Elements.getTypeElementは、実際のタイプComparable<T>を返します。 StringComparable<T>には対応できませんが、Comparable<String>またはComparableに対応してください。したがって、最も簡単な方法は、汎用タイプをTypes.ensure(TypeMirror)で消去することです。

TypeMirror tm = elements.getTypeElement("java.lang.String").asType(); 
TypeMirror comparable = types.erasure(elements.getTypeElement("java.lang.Comparable").asType()); 
boolean isComparable = types.isAssignable(tm, comparable); // return true 
関連する問題