2012-02-01 100 views
10

我在Java中,以下問題得到了類繼承的類: 我有一個基類和派生類中,我有在基類中的方法。當我通過Derived調用Base的foo方法時,我想獲得Derived的類。如果可以這樣做,foo方法可以是通用的。的Java:從靜態方法

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

class Derived extends Base 
{ 
} 

Derived.foo(); 

感謝您的幫助!

David

+0

我不確定這是否可行,而不是像你這樣做的靜態方法。 – 2012-02-01 00:27:26

+2

「我想得到Derived的課程」,這似乎是一件很奇怪的事情。是什麼原因?可能有更好的方法來解決你的真實問題 – Raedwald 2012-02-01 00:27:56

+0

我有一個叫做ActiveModel的模型,我想要一個類似於Rails的界面,例如:列表 brands = Brand.all();品牌從ActiveModel延伸(ActiveModel具有全部功能),現在我必須將Brand.class傳遞給all函數才能爲我的resoruce生成一個url,例如:http://localhost/brands.json我的目標從列表中刪除Brand.class 品牌= Brand.all(Brand.class) – seriakillaz 2012-02-01 00:28:50

回答

4

這不是靜態方法的工作方式。你必須實現Derived.foo(),做什麼,那就是很特別的Derived,然後將該方法調用Base.foo()。如果您確實需要類型信息,則可以創建Base.foo0(Class klass)

但說實話,這需要知道類型,它的上或許應該是一個實例方法調用的類的任何靜態方法。

+0

是的,其實這是我第一個解決這個問題的方式 – seriakillaz 2012-02-01 00:34:07

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方法不是在繼承。具有相同簽名的靜態方法只能隱藏超類中的類似方法。這意味着你永遠不會看到你可能想要的結果 - 你總是完全知道封閉類。靜態方法永遠不可能在另一個類中「內部」。所以產生期望的結果是不可能的。從調用子類或實例的靜態方法就是這個原因,因爲它只是隱藏的真正類是一個壞主意。 (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和代碼分析工具警告,甚至可以自動糾正這一點。

-1
Derived.foo(); 

轉到Derived定義foo,如果定義有:

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'但仍然會在'foo'中將'Derived'作爲類名,就像非靜態方法一樣。 – 2012-02-01 01:28:08

+0

你能舉個例子嗎?我不這麼認爲... – 2012-02-01 07:15:01

+0

我?對不起,我不認爲我得到你的問題。問題中的例子顯示了OP想要什麼,但這是不可能的。 – 2012-02-01 08:18:23