【问题标题】:Why prefer the indirect generic's import to the actual class?为什么更喜欢间接泛型的导入而不是实际的类?
【发布时间】:2016-02-19 07:55:32
【问题描述】:

如果我在包mypack中写这个接口的话使用eclipse:

package mypack;
public interface MyInterface<A>{
  public interface Test{
    void sayHi();
  }
}

如果我在 no 包中编写这个类。

public class Test implements mypack.MyInterface<mypack.MyInterface.Test> {
  private Test test = new Test();
}

Eclipse 在编译时触发我一个错误,我必须实现方法sayHi()

我看不到出路!

如果我 Ctrl+LMBtest 字段的类型,它会将我带到班级。

已报告错误

这里报告了一个小错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=488077

【问题讨论】:

  • 如何在具体类中扩展接口?
  • 我不明白你为什么要实现sayHi
  • @PeterLawrey 我也没有:D自己试试
  • 这就是问题的重点,JB :)
  • 我现在明白了。但任何解决方案都比选择一个更好的、不冲突的名称更糟糕。

标签: java generics compiler-errors


【解决方案1】:

这里发生了什么

Test test = new Test();

Test 被视为您继承自的 MyInterface 的嵌套类型。

我将研究 JLS,看看它是否有理由选择继承的类而不是它自己的名称。

注意:MyInterface 不必是通用的。这个问题的一个更简单的形式是

interface MyInterface {
    interface Test {
    }
}

class Test extends MyInterface {
    Test test = new Test(); // thinks this is the MyInterface.Test
}

顺便说一句:由于这是类结构和名称的非常​​混乱的组合,我建议你不要在现实中这样做。

来自JLS 7.4.2的备注

Java SE 平台提供未命名的包主要是为了方便开发小型或临时应用程序或刚开始开发时。

【讨论】:

  • 这与默认包无关。一切都在 mypack 包中。
  • @JBNizet 不是问题,但你说得对,在这种情况下没关系。
  • 是的,我知道。我什至在你的问题下写了它作为评论。正如我所说:我错过了问题中的“无包裹”。但同样,解决方案非常简单:永远不要将任何类放在默认包中。这样做是不好的做法,会导致各种问题(包括您面临的问题)。避免不良做法时,一切都会变得更顺利:它们是有充分理由的不良做法。
  • @PeterRader 如果它不是问题中的嵌套界面,我建议您更新您的问题。
  • 所以 Eclipse 中存在一个错误,因为如果我 CtrlLMBnew Test() 它会引导我到类,而不是接口。我会报告一个错误!我对sub-type 的含义感到困惑,在我的观点中,子类型不是嵌套类型。
猜你喜欢
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多