有 Java 编程相关的问题?

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

理解泛型的java问题

我编写了以下代码:

public class Test
{   
    public static void main(String args[]) throws ParseException 
    {
        System.out.println(new Generic<Integer>("one").type);  //outputs "one"
    }
}

class Generic<T>
{
    public T type;

    public Generic(Object obj)
    {
        type = (T)obj;
    }
}

我原以为我在演演员时会有例外,但我没有。我得到输出:“一”。但是,如果我做了new generic<Integer>type成为整数类型的变量,那么如何将String{}强制转换为T,并将其存储在我的generic类的变量type中而不出现异常?解释一下就好了


共 (4) 个答案

  1. # 1 楼答案

    没有异常,因为type erasure会从代码中删除对Integer类型的任何检查。由于^{}接受Object,编译器不需要插入强制转换,代码只需擦除即可:

    System.out.println(new Generic("one").type);
    

    请尝试以下分配:

    Integer i = new Generic<Integer>("one").type;
    

    在这种情况下,您将得到一个ClassCastException,因为代码将擦除为:

    Integer i = (Integer)new Generic("one").type;
    

    请注意,切换类型的行为不同。这将抛出一个ClassCastException

    System.out.println(new Generic<String>(123).type);
    

    这是因为使用了^{}重载,因此代码将擦除为:

    System.out.println((String)new Generic(123).type);
    
  2. # 2 楼答案

    class Generic<T>
    {
        public T type;
    
        public Generic(T obj)
        {
            type = obj;
        }
    }
    

    在那里。给你修好了

  3. # 4 楼答案

    它不是将字符串强制转换为整数。。。。因为它是未绑定的。它将T转换为object,在sysout中,您将获得obj。而不是去串

    正确的方法如下,您将在测试类中自动获得编译异常。。。正如所料

    class Generic<T>
    {
        public T type;
    
        public Generic(T t)
        {
            type = t;
    
        }
    }