为什么不能在Java中泛型扩展非泛型类?

时间:2011-09-13 19:19:29

标签: java generics

看起来java中的generic类不能扩展常规的非泛型类。这是什么原因?有没有解决方法?

我错了。正如科林指出我的问题实际上是例外。任何人都可以解释为什么Java中不允许泛型异常吗?

4 个答案:

答案 0 :(得分:6)

public class A {
}

public class B<T> extends A {
}

没有任何问题。

答案 1 :(得分:4)

Java似乎这样做:

public abstract class AbstractCollection<E>
 extends Object
 implements Collection<E>

你有一些代码,所以我们可以看到问题吗?

答案 2 :(得分:3)

因为异常捕获需要jvm在运行时知道确切的异常类型(具体化),这在java中是不可能的,因为编译器会删除所有类型参数信息

答案 3 :(得分:1)

你可以! - 有一定的限制。例外是这些限制之一。你不能使它们通用。如果您抛出了泛型的异常版本,则Erasure将删除异常类型信息,从而防止异常层次结构生效。太糟糕了:(。

考虑一下:

import org.apache.commons.collections.set.UnmodifiableSet;
import org.apache.commons.beanutils.BeanMap;

//Can't do this:
//public class MyBeanMap<K, V> extends BeanMap implements Map<K,V>{

//Can do this:
public class MyBeanMap<K, V> extends BeanMap {

//Can't make actual method calls return generic types.
 public V get(V arg0) {//Name clash
    ...
    return (V)retval;
 }
 //Also can't do this:
 @override
 public V get(V arg0) {//Name clash
    return (V)retval;
 }

}

我猜你可以在现有接口的重写方法中抛出UnsupportedOperation异常,并实现你自己的新泛型方法:

public V getGeneric(V){ ... }

但这似乎比实现Facade模式和扩展地图代码更加丑陋,但这是一个很多中间代码来创建一个外观。

相关问题