将泛型类型乘以二 - 二叉树方法

时间:2012-10-14 15:48:49

标签: java generics casting tree integer

我正在编写一种方法,可以将树中每个节点中数据的大小加倍。我想我已经将算法编写了,但是我无法弄清楚如何将泛型类型乘以2。

所以基本上我想要获取类型为T的数据并将其转换为整数,将其乘以2,并将其存储为类型T.我已经使用了一些选项,但没有一个有效。任何关于如何做到这一点的帮助都会有所帮助。如果您需要任何其他信息,请告诉我。感谢。

2 个答案:

答案 0 :(得分:1)

由于type erasure,您无法直接执行此操作。一种方法是为“知道”如何加倍自身的对象定义通用接口:

public interface Doubler<T> {
    T doubled(T arg);
}

然后,您可以使每个节点(知道如何加倍自身)实现Doubler接口。

还有其他方法(工厂方法,工厂对象,传递Class<T>实例等)可能同样(或更好)。但是你不能做的一件事就是在代码中创建一个泛型类型的实例,它只知道泛型类型而不是其他内容。

答案 1 :(得分:0)

当你声明你的泛型类/树实例/泛型方法时,不要让泛型类型参数T完全不受约束,而是使它成为一个数字(Long或Double,取决于你是否需要处理整数或浮动点数:

代替:

public class DoubleTree<T> {
    private TreeSet<T> myTree;
    public void doubleTree() {
         // ...
         for (T treeElement: myTree) {
               // no way to double element because 
               // "minimum guaranteed base type of T" is Object!!
         } 
    }
}

在第一行尝试T extends Long作为通用类型参数:

public class DoubleTree<T extends Long> {
    private TreeSet<T> myTree;
    public void doubleTree() {
         // ...
         for (T treeElement: myTree) {
               // Element has the Long interface - guaranteed
               T doubleIt = 2 * treeElement;

               // Note - you should really prevent numerical overflow in the above
               // e.g. if (treeElement < Long.MAX_VALUE / 2) {
               //            T doubleIt = 2 * treeElement; 
               //      } else { // Overflow error }
         } 
    }
}

为了更加通用,您可以使用“数字”而不是“长”。但Number是一个抽象类型,它不直接支持常量乘法!您可以通过instanceof在运行时检查实际的类来解决这个问题:

if (treeElement instanceof Long) {
      Long doubleIt = 2 * treeElement.longValue();
} else if (treeElement instanceof Integer) {
      Integer doubleIt = 2 * treeElement.intValue();
} else if (treeElement isntanceof Float) {
      Float doubleIt = 2.0 * treeElement.floatValue();
} // ..... etc