有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java泛型和转换为基元类型

我目前正试图从一本书中学习如何使用泛型。在本章中,它说获取一段数据T并将其转换为整数。我在Eclipse中尝试了不同的事情,但他们似乎都不允许这样做。您如何执行以下任务:

LinkedList<T> arr = new LinkedList<T>();

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

然后在另一节课上:

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

我尝试过使用.valueOf()(int)以及其他一些东西,但似乎没有什么东西能让Java满意。这本书坚持保持方法的通用性,以防使用浮点或double代替字符串或int

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

使用。然后根据需要将其解析为所需的数据类型


共 (3) 个答案

  1. # 1 楼答案

    尽管与主题密切相关,但回答不完全相关。我有个问题,没有找到答案。然后我找到了解决方案,并想与大家分享:

    我试图将泛型值强制转换为基元类型:

    <TYPE> 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
            ...
    

    长话短说:第一个版本不起作用,第二个版本起作用。挺烦人的

  2. # 2 楼答案

    嗯,那是一本奇怪的书。我会根据我所知道的告诉你它的要点

    泛型是一种构造,它允许您在编译时检查您试图在特定集合、方法或类中使用的类型实际上是否知道该特定对象运行所需的功能

    例如,您需要使用由模板中名为SearchParameter的接口确定的函数,但您只将<T>参数视为对象。或者,在您的情况下,更好的示例是一个名为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<IntegerConvert> listOfConvertibles = new ArrayList<IntegerConvert>();
    

    或者如果你想在将来更通用一点

    List<? extends IntegerConvert> listOfConvertibles = new ArrayList<IntegerConvert>();
    

    然后你就可以做了

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

    虽然这是一个有点过于复杂的例子,我想。下面是一个更简单的示例:

    public class Node<E>
    {
        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<Node<Float>> listOfFloatNodes = new ArrayList<Node<Float>>();
            listOfFloatNodes.add(new Node<Float>(new Float(8.7472742f)));
            listOfFloatNodes.add(new Node<Float>(new Float(5.56842742f)));
            listOfFloatNodes.add(new Node<Float>(new Float(6.5467742f)));
            MyOtherClass moc = new MyOtherClass();
            moc.useNodeList(listOfFloatNodes);
        }
    }
    
    public class MyOtherClass
    {
        public <E> void useNodeList(List<Node<E>> list)
        {
             for(Node<E> node : list)
             {
                 printNode(node);
             }
        }
    
        public <E> void printNode(Node<E> node)
        {
             node.print();
        }
    }
    
    public class MainClass
    {
        public static void main(String[] args)
        {
            MyClass myClass = new MyClass();
            myClass.doSomething();
        }
    }
    

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

  3. # 3 楼答案

    尝试观察以下示例:

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

    其中节点为:

        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的未经检查的强制转换(当然有警告),并且编译器相信您可以执行强制转换