【问题标题】:Override method - Class variable覆盖方法 - 类变量
【发布时间】:2013-01-03 14:45:46
【问题描述】:

首先让我说,我确实尝试过用谷歌搜索这个,但我不确定我在寻找什么。我知道我可以使用 setter 方法,但有没有办法直接访问这些字段?

List<String> token = new ArrayList<String>();
List<String> lemma = new ArrayList<String>();
List<String> pos   = new ArrayList<String>();

tt.setHandler(new TokenHandler<String>() {
   @Override
   public void token(final String token, final String pos, final String lemma) {
      this.token.add(token); // cannot be resolved or is not a field
      this.lemma.add(lemma); // cannot be resolved or is not a field
      this.pos.add(pos);     // cannot be resolved or is not a field
   }
});

你能帮帮我吗?!

谢谢!

鲍勃

【问题讨论】:

  • 删除this访问权限,就像token一样
  • 在你的函数中,这是 TokenHandler 的实例。它没有这 3 个变量。
  • 这可能有助于您理解问题:stackoverflow.com/questions/5107158/…

标签: java


【解决方案1】:

在变量前面使用关键字this,表示要访问实例字段。在这种情况下,您要访问的字段将属于匿名类实例new TokenHandler&lt;String&gt;() { //... }。由于它们没有在匿名类中声明,编译器无法解析它们。这就是为什么您可能会遇到错误。 添加关键字final并访问没有this-关键字的变量:

final List<String> tokens = new ArrayList<String>();
final List<String> lemmas = new ArrayList<String>();
final List<String> positions   = new ArrayList<String>();

tt.setHandler(new TokenHandler<String>() {
   @Override
   public void token(final String token, final String pos, final String lemma) {
      tokens.add(token); 
      lemmas.add(lemma); 
      positions.add(pos);
   }
});

有关您为什么需要final 的更多信息,请参阅this 问题。

编辑:

另外,请注意模棱两可的名称(参数列表与方法变量)。

【讨论】:

  • 非常感谢,西蒙(和其他人)!匿名类,就是这样。
【解决方案2】:

不要使用this.token,而是使用OuterClass.this.token,其中OuterClass 是您的班级名称

【讨论】:

  • 变量不是字段。所以这也会导致错误。
  • @Simon 实际上它们是实例字段,这就是他提到使用 getter 方法的原因。
  • @Suhil 你是对的。这个问题不清楚。该代码建议这些变量在方法内声明,但同时他声明他可以使用 getter。如果您编辑答案(添加空格左右),我可以收回我的反对票。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多