2012-02-03 48 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方法之外的任何东西,你所描述的是不可能的