使用通用接口

时间:2014-03-10 18:24:08

标签: java generics interface legacy type-erasure

这两个类声明之间是否有任何差异

1:

class MyClass <T extends Number & Comparable>

2:

class MyClass <T extends Number & Comparable<T>>

我认为存在分歧。但我找不到一个会显示差异的例子,因为我不完全理解。

你能告诉我这个例子吗?

1 个答案:

答案 0 :(得分:5)

有区别。第一种是使用原始类型,因此类型安全性较低。例如:

这有效,但不应该起作用

class MyClass<T extends Number & Comparable>
{
    void use(T t)
    {
        String s = null;
        t.compareTo(s); // Works, but will cause a runtime error
    }
}

虽然这不起作用(因为它 不起作用)

class MyClass<T extends Number & Comparable<T>>
{
    void use(T t)
    {
        String s = null;
        t.compareTo(s); // Compile-time error
    }
}

编辑:完整代码,按要求:

class MyClass<T extends Number & Comparable>
{
    void use(T t)
    {
        String s = "Laziness";
        t.compareTo(s); // Works, but will cause a runtime error
    }
}


public class MyClassTest
{
    public static void main(String[] args)
    {
        MyClass<Integer> m = new MyClass<Integer>();
        Integer integer = new Integer(42);
        m.use(integer);
    }
}