理解泛型的问题

时间:2014-03-12 14:58:33

标签: java generics

我写了以下代码:

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;
    }
}

而且我认为在演员表中我会得到一个例外,但我没有。我得到输出:&#34;一个&#34;。但是,如果我new generic<Integer>type成为Integer类型的变量,那么我如何将String "one"转换为T并将其存储在变量中我的type课程中generic没有例外?解释会很棒。

4 个答案:

答案 0 :(得分:4)

没有例外,因为type erasure会从您的代码中删除对Integer类型的任何检查。由于println需要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);

那是因为使用了println(String)重载,所以代码会删除:

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

答案 1 :(得分:1)

这是因为java类型擦除: http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

基本上java会用对象替换T(如果T没有像你的例子那样没有边界上层类型) - 并且在运行时一切都很好。

答案 2 :(得分:0)

它不会将您的字符串转换为整数....因为它是未绑定的。它将T转换为对象,而在sysout中,您将获得obj.toString。

正确的方法如下所示,您将在测试类中自动获得编译异常......正如预期的那样。

class Generic<T>
{
    public T type;

    public Generic(T t)
    {
        type = t;

    }
}

答案 3 :(得分:-1)

class Generic<T>
{
    public T type;

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

有。为你修好了。