時に継承された入れ子になった静的クラスを解決することができません話は非常に短く、それはLuceneのクラスから数以下の抜粋で始まる:コンパイル
アナライザ:
public abstract class Analyzer implements Closeable {
(...)
public static class TokenStreamComponents { ... }
(...)
}
AnalyzerWrapper:
public abstract class AnalyzerWrapper extends Analyzer {
(...)
@Override
protected final TokenStreamComponents createComponents(String fieldName, Reader aReader) {
return wrapComponents(fieldName, getWrappedAnalyzer(fieldName).createComponents(fieldName, aReader));
}
(...)
}
Grailsアプリケーションの中で私自身のクラスを定義しています。MyAnalyzer.groovy
class MyAnalyzer extends AnalyzerWrapper {
private final PerFieldAnalyzerWrapper perFieldAnalyzerWrapper
public MyAnalyzer() { ... }
@Override
protected Analyzer getWrappedAnalyzer(String fieldName) {
perFieldAnalyzerWrapper.getWrappedAnalyzer(fieldName)
}
@Override
protected TokenStreamComponents wrapComponents(String fieldName, TokenStreamComponents tokenStreamComponents) {
perFieldAnalyzerWrapper.wrapComponents(fieldName, tokenStreamComponents)
}
}
そして、私はアプリケーションをコンパイル/実行しようとすると、私が手:
[groovyc] Compiling 2 source files to E:\somewhere\...\target\classes
[groovyc] org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
[groovyc] E:\somewhere\...\MyAnalyzer.groovy: 31: unable to resolve class TokenStreamComponents
[groovyc] @ line 31, column 5.
[groovyc] @Override
[groovyc] ^
[groovyc]
[groovyc] 1 error
しかし、私はMyAnalyzer
でオーバーライドされたメソッドの定義でAnalyzer.TokenStreamComponents
にTokenStreamComponents
の両方の出現箇所を変更した場合、クラスのコンパイル良い。
誰かがこのような振る舞いの背後に論理的な理由があるかどうかを知っていますか? GroovyやGrailsの振る舞いによって、あるいはここで何かが欠落しているのでしょうか?
内部クラスをインポートしようとしましたか? –
内部クラスをインポートするのは、IDEが不要であると判断して自動的に削除することです。とにかく、私はそれをインポートするか、特別なことをする必要はありません。なぜなら、それはスコープ内で利用できるはずですから。 – konradstrack
しかし、あなたの質問に答えるために、 'org.apache.lucene.analysis.Analyzer.TokenStreamComponents'をインポートすると、コンパイルされます。 – konradstrack