2015-06-06 99 views
3

爲什麼通用T不能用作返回類型class如果T extends ClassJava泛型錯誤理解

例子:

public class Foo<T extends Bar> { 
    Bar[] array = new Bar[200]; 

    Optional<T> forIndex(int index) { 
     return Optional.ofNullable(array[index]); 
    } 
} 

T需要延長Bar這意味着T不應該有一個鑄造的問題,還是我弄錯呢?有人能詳細說明嗎?

回答

5

你弄錯了。每個TBar,但不是每個Bar都是TTBar更專門(每隻達克斯獵犬是一隻狗,但不是每隻狗都是達克斯獵犬)。這意味着,return Optional.ofNullable(array[index]);嘗試匹配Bar上的T,這是不可能的。

你可以做的是使只有方法通用:

public class Main { 
    Bar[] array = new Bar[200]; 

    Optional<? super Bar> forIndex(int index) { 
     return Optional.ofNullable(array[index]); 
    } 
} 

你可能想看看this wiki-page和谷歌搜索PECS也會有所幫助。

+0

看起來像這樣會變成一堆抽象方法的惡劣情況。 '哎呀:'我在問題框中編寫了示例:P – Hobbyist

+0

如果只有通用數組更容易使用。 – Hobbyist

+1

Java泛型的已刪除特性確保了數組和泛型不能很好地混合:數組是協變和保留的,泛型是不變的並且被刪除。 – scottb