Java: получить класс унаследованного класса от статического метода
У меня есть следующая проблема в Java:
У меня есть базовый класс и производный класс, и у меня есть метод в базовом классе. Когда я вызываю метод Base foo через Derived, я хочу получить класс Derived. Метод foo может быть общим, если это можно сделать таким образом.
class Base
{
static void foo()
{
// I want to get Derived class here
// Derived.class
}
}
class Derived extends Base
{
}
Derived.foo();
Спасибо за вашу помощь!
Дэвид
Ответы
Ответ 1
Это не так, как работают статические методы. Вам нужно будет реализовать Derived.foo()
, сделать то, что специально для Derived
, и этот метод вызывает Base.foo()
. Если вам действительно нужна информация о типе, вы можете создать Base.foo0(Class klass)
.
Но, честно говоря, любой статический метод, который должен знать, что тип класса, который он вызвал, должен, вероятно, быть методом экземпляра.
Ответ 2
Ну, вызывающий Derived.foo()
знает, что он вызывает, поэтому вы можете изменить свои методы таким образом:
class Base
{
static void foo(Class< T > calledBy)
{
// I want to get Derived class here
// Derived.class
}
}
class Derived extends Base
{
}
Derived.foo(Derived.class);
Ответ 3
static
методы не наследуются. Статические методы с одной и той же сигнатурой могут скрывать подобные методы в суперклассе. Это означает, что вы никогда не увидите результат, который вы, вероятно, захотите - вы всегда точно знаете охватывающий класс. Невозможно, чтобы статический метод каким-то образом "внутри" другого класса. Поэтому получить желаемый результат просто невозможно. По этой причине вызов статического метода из подкласса или экземпляра - плохая идея, поскольку он просто скрывает реальный класс. (IDE и инструменты анализа статического кода могут отметить или исправить это.)
Источники:
Итак, что работает с унаследованными методами, не работает с методами 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 и инструменты анализа кода предупреждают и могут даже исправлять это автоматически.
Ответ 4
Невозможно, Derived.foo()
просто даст код для Base.foo()
.
Ответ 5
Derived.foo();
Это перейдет к foo
, определенному в Derived
, если он определен там:
class Base {
static void foo() {
System.out.println("Base");
}
}
class Der extends Base {
static void foo() {
System.out.println("Der");
}
}
class Check {
public static void main(String[] args) {
Base.foo();
Der.foo();
}
}
Когда я запустил его:
javac -g Check.java && java Check
Base
Der
Так в чем ваш вопрос? Если вам требуется, чтобы каждый производный класс implement foo
, который невозможно выполнить в Java.