2013-05-11 63 views
0

我已經基本類以下使用泛型或FooClass.CLASS調用靜態方法?

public class Car 
{ 
    public static int getWheelsCount() 
    { 
     return 4; 
    } 
} 

然後我有自定義的方法從中延伸出的幾個子類,如Honda extends CarMercedes extends Car

在一個單獨的方法,我只是想成爲能夠接收Car的特定子小孩,無論是作爲仿製藥還是Honda.CLASS,並致電getWheelsCount()方法。事情是這樣的:

public void doSomething<T extends Car>() 
{ 
    int wheels = T.getWheelsCount(); 
} 

或者:

public void doSomething(Car myCar.CLASS) 
{ 
    int wheels = myCar.getWheelsCount(); 
} 

我可以調用這個函數以這種方式:

doSomething<Honda>(); 
doSomething<Mercedes>(); 

或:

doSomething(Honda.CLASS); 
doSomething(Mercedes.CLASS); 

任何想法,我可以如何完成我想在這裏?

+0

'.CLASS'是'.class',對不對? – wchargin 2013-05-11 03:22:44

+0

你爲什麼不做'Honda.doSomething()'? – CoderOfHonor 2013-05-11 03:23:32

+0

這裏有什麼問題有點困惑 – aaronman 2013-05-11 03:24:06

回答

1

在Java中,靜態方法不能被覆蓋。這主要是因爲Java類本身不是對象,例如像Objective-C這樣的語言。 Java類對象(java.lang.Class的實例)是完全不同的東西,它們只是Java有點冒險的反射系統的一部分。

雖然如果不明白你的目的很難給出很多建議,但我會建議你儘可能地去除Java類中的靜態功能,除非這些方法是實用或輔助方法。嘗試重構您的代碼以傳遞實例而不是類。

有關目標的更多信息,而不是您在實施特定解決方案時遇到的問題的純粹信息,可能會更容易給出更具體和全面的答案。

3

由於靜態方法聲明上Car,只是一直叫:

Car.getWheelsCount(); 

很顯然,你不是說該方法是靜態的,你希望它是一個普通的方法,並有各汽車給它的答案獨立....所以,從方法聲明中刪除'靜態',並讓每個汽車子類重寫方法....然後調用每個車的實例方法。

+0

我不想每次都必須做一個新的對象實例,這就是爲什麼我寧願做一個靜態的方法。 – 2013-05-11 03:30:37

+0

@ClickUpvote:你是什麼意思「你不想每次都創建一個新的實例?除非你已經有一個實例,否則你不需要**方法,所以這個評論沒什麼意義。」 – 2013-05-11 03:41:36

+0

爲什麼它的靜態方法是這樣的,我不需要一個實例,例如,如果我想驗證一輛車有多少個車輪,我可以通過執行'Handa.getWheelCount()'而不是'honda = new本田(); honda.getWheelCount()' – 2013-05-11 04:05:39