Fabuła jest dość krótki i zaczyna się z kilku następujących fragmentów klasy Lucene w:Nie można rozwiązać odziedziczony zagnieżdżony klasę statyczną podczas kompilacji
Analyzer:
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));
}
(...)
}
teraz wewnątrz aplikacji Grails I zdefiniować własną klasę, 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)
}
}
A kiedy próbuję uruchomić/skompilować aplikację, otrzymuję:
[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
Jeśli jednak zmienić zarówno wystąpień TokenStreamComponents
do Analyzer.TokenStreamComponents
w definicji metody zmienione w MyAnalyzer
, przeprowadza kompilację klasy w porządku.
Czy ktoś wie, czy istnieje jakiś logiczny powód takiego zachowania, spowodowane na przykład przy okazji, jak zachowują się Groovy lub Grails, czy też czegoś tu brakuje?
Czy próbowałeś importowania wewnętrzną klasę? –
Zabawa z importowaniem klasy wewnętrznej polega na tym, że mój IDE usuwa ją automatycznie, ponieważ określa, że jest niepotrzebna. I w każdym razie nie powinienem być zobowiązany do importowania go lub robienia czegoś specjalnego, ponieważ powinien on być dostępny w zakresie. – konradstrack
Ale aby odpowiedzieć na twoje pytanie - zaimportowanie 'org.apache.lucene.analysis.Analyzer.TokenStreamComponents' również powoduje jego kompilację. – konradstrack