我正在尝试创建一个通用的二叉搜索树类,它从文件中读取数字并构建BST.我将所有单独的数字放入一个数组中,但我仍然坚持如何将它们转换为未指定的类型.
class ModifiedBinarySearchTree >{
private BinaryNode root;
public void treeInput(String fileName) throws Exception{
BufferedReader br = new BufferedReader( new FileReader(fileName));
String[] nums = br.readLine().split("\\s");
for(String num : nums){
//do something to cast number as type n
//I tried:
N number = N.valueOf(num);
insert(number);
//but that gave me a compile error
}
有没有办法让这项工作?我尝试将字符串转换为double,但之后我无法从double变为n.
解决方法:
所有Number类都有一个String构造函数,因此您可以安全地使用反射来调用该构造函数.由于runtime type erasure,在您的方法中无法访问类型N,因此您必须将具体的类标记传递给构造函数,以获取对类型类的构造函数的引用:
class ModifiedBinarySearchTree >{
private BinaryNode root;
private final Constructor constructor;
// pass in a Number class, eg new ModifiedBinarySearchTree(Integer.class)
public ModifiedBinarySearchTree(Class clazz) {
try {
constructor = clazz.getConstructor(String.class);
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
public void treeInput(String fileName) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line;
while ((line = br.readLine()) != null) {
for (String num : line.split("\\s")) {
insert(constructor.newInstance(num));
}
}
}
或者,您可以使用方法而不是构造函数传递类对象,但这会在某种程度上打败您的类的“通用性”.
我还删除了拼写错误,缩写了一些代码并添加了一个似乎缺失的while循环.
标签:java,generics
来源: https://codeday.me/bug/20190830/1771057.html