2016-11-26 85 views
0

泛型類的對象看看下面的類:構建從字符串中的Java

public class Range<T extends Comparable<T>> 
{ 
    public T lower; 
    public T upper; 

    public Range(String range){ 
     Scanner scanner = new Scanner(range); 
     if(scanner.hasNextInt()) 
      this.lower = scanner.nextInt(); 
     if(scanner.hasNextInt()) 
      this.upper = scanner.nextInt(); 
    } 

    public String toString(){ 
     return lower + " - " + upper; 
    } 
} 

在構造函數中,我試圖從一個字符串構造一個對象。創建對象包含的值在String範圍內。該字符串的格式類似於從toString方法返回的字符串。

這不會很容易,錯誤是在構造函數的最後兩行,它說:「類型不匹配:不能從int轉換爲T.」 Ofcourse ...因爲T類型由用戶決定,並且Scanner.nextInt()總是返回int。即使這可行,只有當T是int時,它纔會起作用。但是讓我們說,如果T只是int,那麼它就可以工作。

有什麼辦法可以用這樣的字符串構造這個類的對象,只有當T是int時。我懷疑是否有類似於C++中的類專業化的東西。

你得到我想要的,比方說那個字符串是「5 - 10」。我想低於5和10,他們需要整數。無論如何可能。

+0

如果你只想要整數,爲什麼有一個泛型?只需將'lower'和'upper'都設爲'int'即可。 – Tunaki

+0

爲什麼你要使用**泛型**,當你有'int'的特定類型? – developer

+0

我已經爲擴展Comparable的所有類型創建了這個類,但是我知道這個構造函數只能在成員是int時才能工作。如果T是浮動的,那麼我想爲這種情況設置特殊的範圍(字符串範圍)。 – Scarass

回答

3

通常做到這一點的一種方法是提供一個Function<String, ? extends T>,它允許您將String解析爲T的實例。

public Range(String range, Function<String, ? extends T> parser){ 
    Scanner scanner = new Scanner(range); 
    if(scanner.hasNext()) 
     this.lower = parser.apply(scanner.next()); 
    if(scanner.hasNext()) 
     this.upper = parser.apply(scanner.next()); 
} 

注意,這個整體方法也不是特別好。首先,你不能創建一個只有上限的範圍;另一方面,它限制你輸入由Scanner標記的字符串;如果你想成爲你的領域final,那麼你是明智的選擇。

你最好在Range類之外進行解析(或者至少在構造函數之外)。例如,你可以使用Optional<T>(或者null,不寒而慄)來表示每個邊界,然後聲明構造函數,像這樣:

public Range(Optional<? extends T> lower, Optional<? extends T> upper) 

這樣你就可以創建所需的範圍內,使用任何格式提供你想要的邊界 - 在調用構造函數之前,你構造了lowerupper實例,所以你可以自由構建你喜歡的方式。