java匿名内部类无法访问的代码

kio*_*oto 2 java inner-classes unreachable-code

编写无法访问的代码时,Java编译器会抱怨.例如

public void go()
{
    return;
    System.out.println("unreachable");
}
Run Code Online (Sandbox Code Playgroud)

但是,当您在匿名类中定义一个无法从任何地方访问的新方法时,编译器不会抱怨.它允许你这样做,为什么?例如,

class A
{
   public void go()
   {
     System.out.println("reachable - A");
   }
}
class B
{
   public static void main(String [] args)
   {
     A a = new A() {
              public void go()
              {
                System.out.println("reachable - B");
              }
              public void foo()
              {
                System.out.println("unreachable - B");
              }
           };
     a.go(); // valid
     a.foo(); // invalid, compiler error
  }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

这只相当于允许你创建私有方法,这些方法在类中的任何地方都没有被调用.这是完全不同的代码 - 并且可以通过反射访问它.

这是可以合理地发出警告的事情(特别是在允许非常细粒度调整警告的IDE上),但我不认为这应该是一个错误.


Joa*_*uer 5

首先:Eclipse 确实通知我foo()从未在本地使用过.然而,由于其他anserws指出的原因,这是一个警告,而不是错误.

请注意,有一种方法可以达到foo():

new A() {
      public void go()
      {
        System.out.println("reachable - B");
      }
      public void foo()
      {
        System.out.println("unreachable - B");
      }
}.foo();
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为表达式的类型new A() {}不是A,但实际上是匿名的子类A.那个子类有一个公共foo方法.

由于您不能拥有相同类型的变量,因此无法foo()从变量访问此方法.