我正在编写一种方法,可以将树中每个节点中数据的大小加倍。我想我已经将算法编写了,但是我无法弄清楚如何将泛型类型乘以2。
所以基本上我想要获取类型为T的数据并将其转换为整数,将其乘以2,并将其存储为类型T.我已经使用了一些选项,但没有一个有效。任何关于如何做到这一点的帮助都会有所帮助。如果您需要任何其他信息,请告诉我。感谢。
答案 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