Метод не переопределяет видимый метод пакета в Eclipse - PullRequest
1 голос
/ 21 февраля 2011

Из настройки компилятора Java Eclipse: Метод не переопределяет видимый метод пакета

"Метод пакета по умолчанию не отображается в другом пакете и, следовательно, не может быть переопределен.Если эта опция включена, компилятор сообщит о таком сценарии как об ошибке или предупреждении. "

Как я могу вызвать это Предупреждение / Ошибка?Я ищу пример кода.

Ответы [ 4 ]

5 голосов
/ 21 февраля 2011

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 :

Метод пакета по умолчанию не отображается в другом пакете и поэтому не может быть переопределен. Когда эта опция включена, компилятор будет сигнализировать о таком сценарии как об ошибке или предупреждении.

0 голосов
/ 29 августа 2018

Пример того, почему это предупреждение или ошибка важны, рассмотрим следующий пример:

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, затем повторно запустите код, который теперь будет работать, как и ожидалось. В этом простом примере совершенно ясно, что происходит, но в более сложной ситуации это поведение может быть крайне запутанным и, возможно, неправильным, поэтому к предупреждению следует относиться серьезно.

0 голосов
/ 21 февраля 2011
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 голосов
/ 21 февраля 2011
package b;

public class Foo {

    void test() {}

}

А

package a;

import b.Foo;

public class Bar extends Foo {

    void test() {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...