Javagenerics并转换为基本类型

我目前正在尝试学习如何使用一本书中的generics。 在本章中,它说要获取一段数据T并将其转换为整数。 我在Eclipse中尝试不同的东西,但似乎没有人允许这样做。 你怎么能执行以下任务:

LinkedList arr = new LinkedList(); Float fl = 8.74273123948; arr.add(fl); 

然后在另一个class级:

 public int findValue(Node node) { T data = node.data; int value = Number.valueOf(data); return value; } 

我尝试过在其他一些事情中使用.valueOf()(int) ,似乎没有什么可以满足Java。 本书坚持保持方法通用,以防使用浮点数或双精度数而不是字符串或整数。

编辑:对于可能有类似问题的其他人。 从对这个问题的所有评论和接受的答案中收集到:

对数据使用.toString(),然后根据需要解析它,无论您需要哪种数据类型。

嗯,这是一本奇怪的书。 我会试着根据我的知识告诉你它的要点。

generics是一种结构,允许您编译时检查您尝试在特定集合,方法或类中使用的类型是否实际上知道该特定事物运行所必需的function。

例如,您需要在模板中使用由名为SearchParameter的接口确定的函数,但只能将参数视为对象。 或者,在你的情况下,一个更好的例子是一个名为IntegerConvert的自定义接口,如下所示:

 public interface IntegerConvert { Integer returnAsInteger(); } 

你可以有这样一个类:

 public class MyData implements IntegerConvert { private String data; public MyData(String data) { this.data = data; } @Override public Integer returnAsInteger() { return Integer.parseInt(data); //throws ParseException if it doesn't work } } 

然后你就可以得到这样的列表:

 List listOfConvertibles = new ArrayList(); 

或者如果你想在未来更加通用,

 List listOfConvertibles = new ArrayList(); 

然后你就可以做到

 listOfConvertibles.add("25"); listOfConvertibles.add("40"); listOfConvertibles.add("35"); for(IntegerConvert ic : listOfConvertibles) { System.out.println("" + ic.returnAsInteger()); } 

虽然这是一个过于复杂的例子,但我想。 一个更简单的例子如下:

 public class Node { private E data; public Node(E e) { this.data = e; } public E getData() { return data; } public void setData(E e) { data = e; } public void print() { System.out.println(data.toString()); } } public class MyClass { public void doSomething() { List> listOfFloatNodes = new ArrayList>(); listOfFloatNodes.add(new Node(new Float(8.7472742f))); listOfFloatNodes.add(new Node(new Float(5.56842742f))); listOfFloatNodes.add(new Node(new Float(6.5467742f))); MyOtherClass moc = new MyOtherClass(); moc.useNodeList(listOfFloatNodes); } } public class MyOtherClass { public  void useNodeList(List> list) { for(Node node : list) { printNode(node); } } public  void printNode(Node node) { node.print(); } } public class MainClass { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.doSomething(); } } 

如果您有任何问题,请发表评论。

试着观察下面的例子:

 public static void main(String[] args) { test0("13"); test0(new Integer(13)); test1(); System.out.println(findValue(new Node("10"))); } private static  void test0(T a) { LinkedList arr = new LinkedList(); arr.add((T) a); System.out.println(arr.getFirst()); } private static  void test1() { LinkedList arr = new LinkedList(); arr.add((T) new Integer(13)); System.out.println(arr.getFirst()); } public static  int findValue(Node node) { T data = (T) node.data; int value = Integer.valueOf(data.toString()); return value; } 

其中Node是:

  public class Node { //this should be private public String data; public Node(String data) { this.data = data; } //use getter below to access private data public String getData() { return data; } } 

所有这一切都是可能的,因为,允许从已知类型到T的未经检查的强制转换(当然有警告),并且编译器相信您进行投射。

虽然密切相关,但不完全回答这个话题。 我有一个问题,但没有找到答案。 然后我找到了解决方案并认为我会分享:

我试图将通用值转换为基本类型:

  boolean equal(TYPE val, Class type) { if (float.class == type) { float val2 = (float) val; // incompatible types: TYPE cannot be converted to float float val3 = (float) (Object) val; // works ... 

长话短说:第一版不起作用,第二版不起作用。 真烦人