簡體   English   中英

為什么泛型不能在Java中擴展非泛型類?

[英]Why cannot generic extend a non-generic class in Java?

看起來Java中的generic類無法擴展常規的非泛型類。 是什么原因呢? 有什么解決方法嗎?

我誤解了。 正如ColinD指出的那樣,我的問題實際上是例外。 誰能解釋為什么Java中不允許通用異常?

public class A {
}

public class B<T> extends A {
}

運作沒有任何問題。

Java似乎做到了:

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

您有一些代碼,以便我們可以看到問題嗎?

因為異常捕獲要求jvm在運行時(確切化)知道異常的確切類型,這在Java中是不可能的,因為所有類型參數信息都由編譯器擦除

您可以! -有一定的限制。 例外是那些限制之一。 您不能使它們通用。 如果您拋出異常的通用版本,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異常,並實現自己的新通用方法:

公共V getGeneric(V){...}

但這似乎比實現外觀模式和僅擴展地圖代碼要難看得多,但這是大量用於為其創建外觀的中間代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM