2013-03-08 51 views
3

這個想法是做類似下面的事情,並讓編譯器在編譯時檢查toLoad是一個可以包含AType對象的數組(即:AType extends或T NOT T extends或AType)。有沒有辦法用泛型來做到這一點?是否有一種「超類」方式來定義泛型中的類型或僅「擴展」?

private List<AType> aList_; 

<T superclassof AType> T[] loadArray(T[] toLoad) { 
    for(int i = 0; i < alist_.size(); ++i) { 
     toLoad[i] = (T)aList_.get(i); 
} 
+1

不是我所知道的。你能解釋一下你爲什麼要這樣做嗎? – 2013-03-08 00:08:01

+0

[用'超級'關鍵字綁定泛型]的可能副本(http://stackoverflow.com/questions/2800369/bounding-generics-with-super-keyword) – 2013-03-08 02:42:03

+0

這是* general *問題 - 以上僅僅是簡單的說明一個有效的潛在願望:)這是一個數組可能有任何對象分配給它的數組元素類型是一個超類。即:在編譯時沒有檢查java.util.List 中的「 T [] toArray(T [] a)」方法,但可以拋出運行時異常。 – peterk 2013-03-09 02:28:18

回答

4

更改我的答案。是的,有一個「超級」關鍵字用於泛型,但我不認爲它會在這裏工作。

這裏是如何使用它的說明:java generics super keyword

什麼你應該做的是在名單上返回Collections.toArray()並將其綁定到你正在使用(這可能是通用本身)的類型。我不認爲你真的需要將返回類型定義爲任何東西的超類。

+4

它不會編譯。也許在java 9中。 – irreputable 2013-03-08 00:13:02

+0

不可否認的是對的,這個答案需要編輯。 – 2013-03-08 00:27:41

4

不... Java不允許類型變量的下界,儘管有一些有效的用例......就像你的。

如果您使用List,我們可以使用通配符和下限List<? super A>。但不適用於陣列。

​​

雖然我們可以將一個數組包裝在List中。

Object[] array = new Object[length]; 

load(new Wrapper<>(array)); 

class Wrapper<E> implements List<E> 
{ 
    E[] array; 

    Wrapper(E[] array){ this.array=array; } 

    E set(int index, E element) 
    { 
     check index<array.length 
     array[index] = element; 
    } 
相關問題