Java:为什么泛型类不强制使用相同的类型?

时间:2014-12-08 13:11:10

标签: java generics

我有:


    public final class SomeClass<L, R>{
    ....
    }

如果我这样做:


    public final class SomeClass<L, R>{
    ....

    public someMethod(Object obj)
    {
    SomeClass other<L, R> = (SomeClass<L, R>) obj;
    ....
    }
    ....
    SomeClass<String, String> firstObject = new SomeClass<String, String>();
    SomeClass<Integer, Integer> secondObjec = new SomeClass<Integer, Integer>();
    firstObject.someMethod(secondObject );
    ...

即使LR类型与firstObjectsecondObject不同,它也不会抛出强制转换异常。 为什么呢?

2 个答案:

答案 0 :(得分:4)

此代码将编译,因为您将对象作为参数传递,并将其显式强制转换为SomeClass<L, R>。由于type erasure,只要您传递SomeClass的任何实例,这将在运行时工作,因为到那时所有泛型类型都将消失。我猜你在编译期间收到Type safety: Unchecked cast from Object to SomeClass<String, String>警告(除非你指定了@SuppressWarnings("unchecked"))。

为了避免这种情况,您必须指定您允许作为参数传递的对象的类型,例如:

public someMethod(SomeClass<L, R> obj)

答案 1 :(得分:2)

Java中的泛型由编译器检查。在运行时不会考虑它。