【问题标题】:Is this a Design issue or Eclipse's issue or Java's loophole?这是设计问题还是 Eclipse 的问题或 Java 的漏洞?
【发布时间】:2011-07-27 10:04:26
【问题描述】:

让我们在eclipse的工作空间中定义以下类:

public abstract class A {
   public void foo() {
      System.out.println("Hi.. this is foo()");
   }
}

public interface I {
   void foo();
}

public class B extends A implements I {
   public void bark() {
      System.out.println("Hi.. this is bark()");
   }
}

public class C {
   public void woo() {
      I i = new B();
      i.foo();
   }
}

现在的问题是 eclipse 在搜索时没有显示任何对 A.foo() 的引用

  • 参考 -> 项目或
  • 参考 - 层次结构

我认为这是一个设计问题。你怎么看?

【问题讨论】:

  • 这当然与eclipse如何查找引用有关。它与 Java 本身没有任何关系...
  • 我不知道 Eclipse 方面,但我觉得奇怪的是 A 没有被声明为实现 I。
  • 从技术上讲,这可能是合法的。实际上,正如 Matthew 所说,这只是感觉很脏,这可能是 Eclipse 的人从来没有像这样实现 smthn 的原因......
  • 是的,即使我同意 Matthew 和 TC1.. 这只是感觉很脏.. 有一个抽象类 A 实现我会更好吗

标签: java eclipse class-design


【解决方案1】:

对我来说听起来完全合理,因为在您提供的代码 A 中 没有 实现 I,只有 B 实现。事件虽然在B 代码的声明中读出extends A implements I,但这并不意味着A 将追溯实现接口I - 它说“B 扩展了A 并且还实现了I”。

【讨论】:

  • 我认为我们应该避免这样设计..也就是说我们应该避免在独立的抽象类中编写具体方法..
  • 有一个抽象类A实现我是不是更好
  • 在B类中,接口I的实现来自A类。也就是说A.foo必须满足I要求的契约,从逻辑上讲,A实现I一定是合理的.
  • 代码是public abstract class A,而不是public abstract class A implements I,因此A没有不实现I
  • 在现有代码中,A 未标记为实现 I - 当然。我想说的是,将 A 标记为实施 I 会更合乎逻辑。
【解决方案2】:

在 Eclipse 中为我工作:

A a = new A() { };
a.foo(); // <-- A.foo() found this reference by Eclipse in "References -> Project"

【讨论】:

  • 是的,没错。
     public class C { public void woo() { I i = new B(); i.foo();//从A.foo()中找不到引用,因为A没有实现 I B b = new B(); b.foo();//引用可以从 A.foo() A a = new B(); a.foo();//引用可以从A.foo()中找到 } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多