从Eclipse Java编译器设置:Method不会覆盖包可见方法
“程序包默认方法在另一个程序包中不可见,因此无法覆盖。启用此选项后,编译器会将此类情况指示为错误或警告。”
如何触发此警告/错误?我正在寻找一个代码示例。
package foopackage;
public class Foo {
String getString() {
return "foo";
}
}
package barpackage;
import foopackage.Foo;
public class Bar extends Foo {
String getString() {
return "bar";
}
}
应该这样做。
包默认方法在另一个包中不可见,因此无法覆盖。启用此选项后,编译器会将此类方案指示为错误或警告。
package b;
public class Foo {
void test() {}
}
和
package a;
import b.Foo;
public class Bar extends Foo {
void test() {}
}
package a;
public class A {
// package protected method foo : no visibility modifier
void foo() {
}
}
package b;
public class B extends A {
// although this method has the same signature as A.foo(), it doesn't
// override it because A.foo is not visible to B (other package)
void foo() {
}
}
请注意以下示例,了解此警告或错误的重要原因示例:
package a;
public class Animal {
// Note: no visibility modifier therefore package-private
String makeNoise() {
return "no noise defined";
}
}
package b;
import a.Animal;
public class Cat extends Animal {
// Note: Eclipse will show the warning that it doesn't override
public String makeNoise() {
return "meow";
}
}
package b;
import a.Animal;
public class Dog extends Animal {
// Note: Eclipse will show the warning that it doesn't override
public String makeNoise() {
return "bark";
}
}
package a;
import java.util.ArrayList;
import java.util.List;
import b.Cat;
import b.Dog;
public class Main {
public static void main(String[] args) {
// Make a list of Animals
List<Animal> animals = new ArrayList<>();
animals.add(new Cat());
animals.add(new Dog());
// Loop through the animals making their noises
for (Animal animal : animals) {
System.out.println(animal.makeNoise());
}
}
}
复制将整个内容粘贴到Eclipse中,它将对类和包进行排序。然后运行Main
类。你可能希望它打印出来
meow
bark
但相反它打印
no noise defined
no noise defined
这是令人困惑的行为,意外地破坏了多态性。这样做的原因是Animal
子类Cat
和Dog
实际上根本没有覆盖makeNoise
方法,因此当makeNoise
在Animal
上调用时它使用Animal
实现。
要修复此代码,请将public
或protected
修饰符添加到Animal
makeNoise
方法中,然后重新运行它现在将按预期工作的代码。在这个简单的例子中,它非常清楚发生了什么,但在更复杂的情况下,这种行为可能非常混乱,可能不正确,因此应该认真对待警告。