2012-02-01 6 views
10

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

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

class Derived extends Base 
{ 
} 

Derived.foo(); 

Благодарим за помощь!

Дэвид

+0

Я не уверен, что это выполнимо вообще, а не со статическими методами, как вы это сделали. –

+2

«Я хочу получить класс Derived», который кажется странным. По какой причине? Может быть, лучший способ решить вашу реальную проблему. – Raedwald

+0

У меня есть модель под названием ActiveModel, и мне нужен интерфейс Rails, например: List brand = Brand.all(); и марка простирается от ActiveModel (у ActiveModel есть все функции), сейчас я должен передать Brand.class ко всей функции, чтобы иметь возможность генерировать URL-адрес для моего resoruce, например: http: //localhost/brands.json Моя цель для удаления Brand.class из списка бренды = Brand.all (Brand.class) – seriakillaz

ответ

4

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

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

+0

Да, на самом деле так я сначала работал над этой проблемой – seriakillaz

0

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

3

Ну, вызывающий 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

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

-1
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

Вопрос был: Не иметь 'Derived.foo' но все равно получить 'Derived' как classname в' foo', как в нестатических методах. –

+0

Можете ли вы привести пример? Я так не думаю ... –

+0

Me? Извините, я не думаю, что у меня есть ваш вопрос. Пример в вопросе показывает, чего хочет OP, но это невозможно. –

Смежные вопросы