static
методы не inheritated. Статические методы с одной и той же сигнатурой могут скрывать подобные методы в суперклассе. Это означает, что вы никогда не увидите результат, который вы, вероятно, захотите - вы всегда точно знаете охватывающий класс. Невозможно, чтобы статический метод каким-то образом «внутри» другого класса. Поэтому получить желаемый результат просто невозможно. По этой причине вызов статического метода из подкласса или экземпляра - плохая идея, поскольку он просто скрывает реальный класс. (Иды и инструменты статического анализа кода может маркировать или исправить это.)
Источники:
Так что работает с унаследованных методов не работает с static
методами которые не наследуются.
class Base {
static void foo() {
// Only the static context is available here so you can't get class dynamic class information
}
void bar() {
System.out.println(getClass());
}
}
class Derived extends Base {
}
class Another extends Base {
static void foo() {
// No super call possible!
// This method hides the static method in the super class, it does not override it.
}
void bar() {
super.bar();
}
}
Derived derived = new Derived();
derived.bar(); // "class Derived"
Base base = new Base();
base.bar(); // "class Base"
// These are only "shortcuts" for Base.foo() that all work...
derived.foo(); // non-static context
Derived.foo(); // could be hidden by a method with same signature in Derived
base.foo(); // non-static context
Base.foo(); // Correct way to call the method
Another a = new Another();
a.foo(); // non-static context
Another.foo();
Это хорошая идея, что язык позволяет это? - Хм. Я думаю, что это говорит о том, что IDE и инструменты анализа кода предупреждают и могут даже исправить это автоматически.
Я не уверен, что это выполнимо вообще, а не со статическими методами, как вы это сделали. –
«Я хочу получить класс Derived», который кажется странным. По какой причине? Может быть, лучший способ решить вашу реальную проблему. – Raedwald
У меня есть модель под названием ActiveModel, и мне нужен интерфейс Rails, например: List brand = Brand.all(); и марка простирается от ActiveModel (у ActiveModel есть все функции), сейчас я должен передать Brand.class ко всей функции, чтобы иметь возможность генерировать URL-адрес для моего resoruce, например: http: //localhost/brands.json Моя цель для удаления Brand.class из списка бренды = Brand.all (Brand.class) –
seriakillaz