【问题标题】:Unable to resolve an inherited nested static class during compilation编译期间无法解析继承的嵌套静态类
【发布时间】:2013-07-12 11:53:58
【问题描述】:

故事很短,从以下几个 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 中的重写方法的定义中将TokenStreamComponents 的出现都更改为Analyzer.TokenStreamComponents,则该类可以正常编译。

有谁知道这种行为背后是否有某种合乎逻辑的原因,例如顺便说一下 Groovy 或 Grails 的行为方式,或者我只是在这里遗漏了什么?

【问题讨论】:

  • 你试过导入内部类吗?
  • 导入内部类的乐趣在于我的 IDE 会自动删除它,因为它确定它是不必要的。无论如何,我不应该被要求导入它或做任何特别的事情,因为它应该在范围内可用。
  • 但要回答您的问题 - 导入 org.apache.lucene.analysis.Analyzer.TokenStreamComponents 也会使其编译。
  • 我认为这就是它的行为方式。我在使用来自java.utilMapMap.Entry 时遇到了这个问题。
  • Groovy 的导入行为是 Java 的镜像。它的工作方式是因为 import 仅适用于类:它不直接处理包或类成员,因此您必须具体。 (通配符是一个例外。)您可以使用import org.apache.lucene.analysis.Analyzer.TokenStreamComponentsimport static org.apache.lucene.analysis.Analyzer.* 使其工作。如果要删除有效的导入,您的 IDE 就搞砸了;我从未在 Eclipse 或 IDEA 中看到过这种情况。

标签: java grails groovy


【解决方案1】:

只需添加行 import Analyzer.*;到程序的导入部分。 !让我知道它是否解决了。!

【讨论】:

  • Map.Entry 类有同样的问题。使用显式导入 java.util.Map.Entry 解决
猜你喜欢
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多