Java 用二叉树方法乘以泛型类型

Java 用二叉树方法乘以泛型类型,java,generics,casting,tree,integer,Java,Generics,Casting,Tree,Integer,我正在编写一个方法,它将树中每个节点中的数据大小加倍。我想我已经准备好了编写它的算法,但是我很难弄清楚如何将泛型类型乘以2 所以本质上我想取一个T型数据,将它转换成一个整数,乘以2,然后将它存储为T型。我已经尝试了一些选项,但没有一个有效。任何关于我应该怎么做的帮助都会很有帮助。如果你需要任何其他信息,请告诉我。谢谢。因为,您不能直接这样做。一种方法是为“知道”如何加倍的对象定义通用接口: public interface Doubler<T> { T doubled(T a

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

所以本质上我想取一个T型数据,将它转换成一个整数,乘以2,然后将它存储为T型。我已经尝试了一些选项,但没有一个有效。任何关于我应该怎么做的帮助都会很有帮助。如果你需要任何其他信息,请告诉我。谢谢。

因为,您不能直接这样做。一种方法是为“知道”如何加倍的对象定义通用接口:

public interface Doubler<T> {
    T doubled(T arg);
}
公共接口倍增器{
T加倍(T arg);
}
然后,您可以让每个节点(知道如何将自身加倍)实现
加倍器
接口


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

当你声明你的泛型类/树实例/泛型方法时,不要让泛型类型参数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!!
         } 
    }
}
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”而不是“Long”。但是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

什么知道如何将其转换为整数?Java不仅知道如何通过
hashCode
以外的方式任意初始化一个对象,而且倍增的结果也没有意义。另外,什么是
t
t
没有扩展
倍增器,所以它本身不会倍增。@MikeSamuel-关于这个研究的好发现rved word.
T
是OP描述为每个节点中的数据的类型参数。我建议使用类型参数