我有:
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 );
...
即使L
和R
类型与firstObject
到secondObject
不同,它也不会抛出强制转换异常。
为什么呢?
答案 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中的泛型由编译器检查。在运行时不会考虑它。