方法不会覆盖Eclipse中的包可见方法

时间:2011-02-21 18:59:25

标签: java eclipse warnings visibility

从Eclipse Java编译器设置:方法不会覆盖包可见方法

“包默认方法在另一个包中不可见,因此无法覆盖。启用此选项后,编译器会将此类方案指示为错误或警告。”

如何触发此警告/错误?我正在寻找一个代码示例。

4 个答案:

答案 0 :(得分:5)

Foo.java:

package foopackage;

public class Foo {
    String getString() {
        return "foo";
    }
}

Bar.java:

package barpackage;

import foopackage.Foo;

public class Bar extends Foo {
    String getString() {
        return "bar";
    }
}

应该这样做。

来自Eclipse Help docs

  

包默认方法在其他包中不可见,因此无法覆盖。启用此选项后,编译器会将此类方案指示为错误或警告。

答案 1 :(得分:0)

package b;

public class Foo {

    void test() {}

}

package a;

import b.Foo;

public class Bar extends Foo {

    void test() {}
}

答案 2 :(得分:0)

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() {
    }
}

答案 3 :(得分:0)

为什么此警告或错误很重要的示例,请考虑以下示例:

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());
        }
    }

}

Copy将整个内容粘贴到Eclipse中,它将整理出类和包。然后运行Main类。您可能希望它能打印

meow
bark

但是它会打印

no noise defined
no noise defined

这是令人困惑的行为,意外地破坏了多态性。这样做的原因是Animal子类CatDog实际上根本没有覆盖方法makeNoise,因此在{ {1}}使用makeNoise实现。

要修复此代码,请在Animal Animal方法中添加publicprotected修饰符,然后重新运行该代码,现在该代码将按预期运行。在这个简单的示例中,它很清楚发生了什么,但是在更复杂的情况下,此行为可能会造成极大的混乱,甚至可能是错误的,因此应认真对待警告。