2014-02-14 25 views
1

我想打一個愚蠢的例子爲我的學生,但鴕鳥政策知道如果我可以做什麼I'm想「通用方法」,「絕對值」的java

我想要做的ABS法仿製藥。

我的想法是與此類似:在這個LINEA

public class MiMath { 
    public static <T extends Number> T abs(T objeto) { 
    if (objeto.doubleValue()<0) 
     return (T) -objeto.doubleValue(); 
    else 
     return objeto; 
    } 
} 

return (T) -objeto.doubleValue(); 

日食說,(T)是不是一個類型

+7

這不是展示泛型的好方法。這是純粹的多態。 –

+0

這裏不需要泛型,'doubleValue()'是'Number'上的一個虛擬方法。 abs(Number obj)'會做得很好。 – bobah

+1

問題是,如果我傳入'BigDecimal',那麼它就是'doubleValue()'並返回'Double'。你得到一個'T'類型,但返回一個'Double'。你嘗試將它轉換爲'(T)',這顯然是一個'ClassCastException'。您可以在Java 7中轉換爲泛型類型 - 您顯然使用的是早期版本 - 但這對您無能爲力。 –

回答

-1

泛型信息(T)存在只在編譯時,並在編譯後丟棄。

因此,您不能在運行時轉換爲泛型,這是您的return語句所做的。

+0

這是錯誤的。這在Java 7中是可能的。 –

1

你的動機是返回一個與它所調用的類型相同的對象。

不幸的是,泛型不能幫助你。在您的線路

return (T) -objeto.doubleValue(); 

你實際上不得不說

return new T(-objecto.doubleValue()); 

但不能工作,因爲T沒有在編譯時已知,那就是當它決定必須作出。

一種方式來獲得類似的結果,但遠不如優雅,將有一個接口

public interface AbsEvaluator<N extends Number> { 
    N abs(N n); 
} 

,並有像

AbsEvaluator<Integer> intAbs = 
    new AbsEvaluator<Integer>() { public Integer abs(Integer n) { return -n; }}; 

實現的實施將是完全一樣的每種類型,所以該計劃相當薄弱。

依賴於您所尋找類型的類型推斷的好例子是高階函數(當然,Java沒有一流的函數,因此您必須使用單方法接口對它們進行建模)。然後,你可以,例如,有

<T,U,V> Function<T, V> compose(Function<U, V> g, Function<T, U> f); 

不完全是初學者的東西,尤其是當實現也顯示,但也許適合你的課程。請注意,當Java 8發佈時,這種東西將變得非常突出。

1

問題是,你在這裏用(T)做的事情並不是真正的演員,幕後使用自動裝箱和調用T.valueOf() - 哪些泛型不知道。

對於泛型的一個很好的例子,你最好使用像集合這樣的東西(因爲它們也是人們最有可能使用它們的地方)。