看起来java中的generic
类不能扩展常规的非泛型类。这是什么原因?有没有解决方法?
我错了。正如科林指出我的问题实际上是例外。任何人都可以解释为什么Java中不允许泛型异常吗?
答案 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模式和扩展地图代码更加丑陋,但这是一个很多中间代码来创建一个外观。