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

问题描述 投票:1回答:4

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

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

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

java eclipse warnings visibility
4个回答
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

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


0
投票
package b;

public class Foo {

    void test() {}

}

package a;

import b.Foo;

public class Bar extends Foo {

    void test() {}
}

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

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

}

复制将整个内容粘贴到Eclipse中,它将对类和包进行排序。然后运行Main类。你可能希望它打印出来

meow
bark

但相反它打印

no noise defined
no noise defined

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

要修复此代码,请将publicprotected修饰符添加到Animal makeNoise方法中,然后重新运行它现在将按预期工作的代码。在这个简单的例子中,它非常清楚发生了什么,但在更复杂的情况下,这种行为可能非常混乱,可能不正确,因此应该认真对待警告。

© www.soinside.com 2019 - 2024. All rights reserved.