2012-02-03 46 views
0

我正在嘗試創建一個通用容器(例如下面的java代碼),它有一些限制,例如大於某個限制的項目不能放在其中。問題是,由於T是一個未知類型,因此帶整數的比較函數報告錯誤。如何解決這個問題?通用/模板類型檢查

其次,如果代碼是用C++編寫的,是否有解決方案?

public class Box<T> { 
    private T val; 
    private int max; 

    public Box (int m, T initval) { max = m; val = initval; } 

    public T get() { return val; } 
    public void set(T newval) { 
     val = newval; 
     if(newval.toInt() >= max) // error on toInt 
      System.out.printf("ERR: size too big\n"); 
     } 
} 

回答

2

你應該有

interface ToIntable { 
    int toInt(); 
} 

public class Box<T extends ToIntable> { 
... 
    if (newval.toInt() >= max) doSomething(); 
... 
} 
+0

在C++中,我相信你必須有'operator> ='在你的類型名稱'T'(或'operator' =''接受'T'和'int')中接受'int'。 – 2012-02-03 17:37:00

+0

非常感謝。 – R71 2012-02-04 04:57:42

0

您可以使用接口,而不是使用泛型?在這種情況下,它可能只是一個標記接口,沒有方法來表示可以在容器上使用的類型。

+0

我不明白..你能展示一個代碼示例嗎? – R71 2012-02-04 04:55:53

2

一些對象根本沒有toInt()方法。在你的情況下,你只能調用Object類中包含的方法(所有類都從中繼承)。

如果您確定將使用哪些類型的對象,您可以將其轉換爲所需的類型並從中訪問toInt()方法。然而,由於它是一個通用的容器,所以你無法控制它。

確保有toInt()方法執行的另一種方法是使通用接受一個接口。您可以在界面中定義toInt(),並且您將能夠使用該容器和任何實現該界面的類。

正如我剛纔所說,你這樣做的方式,你只能訪問Object類的方法。所以,簡而言之,實現一個真正的通用目的容器,使用除了Object方法之外的任何東西,你所描述的是不可能的