Java: получить класс унаследованного класса из статического метода - PullRequest
11 голосов
/ 01 февраля 2012

У меня есть следующая проблема в Java: у меня есть базовый класс и производный класс, и у меня есть метод в базовом классе.Когда я вызываю метод foo Base через Derived, я хочу получить класс Derived.Метод foo может быть универсальным, если его можно сделать таким образом.

class Base
{
    static void foo()
    {
        // I want to get Derived class here
        // Derived.class
    }
}

class Derived extends Base
{
}

Derived.foo();

Спасибо за вашу помощь!

David

Ответы [ 5 ]

4 голосов
/ 01 февраля 2012

Это не тот способ, которым работают статические методы. Вам нужно будет реализовать Derived.foo(), сделать что-то особенное для Derived, и тогда этот метод вызовет Base.foo(). Если вам действительно нужна информация о типе, вы можете создать Base.foo0(Class klass).

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

3 голосов
/ 01 февраля 2012

Ну, вызывающий 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);
1 голос
/ 01 февраля 2012

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 и инструменты анализа кода предупреждают и могут даже исправить это автоматически.

0 голосов
/ 01 февраля 2012
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.

0 голосов
/ 01 февраля 2012

Невозможно, Derived.foo() просто даст код для Base.foo().

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