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.