2012-11-14 202 views
1

理論上,子類方法中的輸入參數應該等於或小於超類的輸入參數(逆變)。擴展泛型類,但弱化子類中的泛型綁定

我想要做的基本上是創建一個類A,有一個通用的結合<T extends SomeType>,但隨後創建一個子類B,沒有通用的綁定(應該允許任何類型)<T>

class A<T extends SomeType> {....} 

    class B<T> extends A<T extends SomeType> { ..... } 

這是甚至可能在Java或從理論的角度來看是正確的?

+0

B延長A有意義嗎? –

回答

4

不,這是不正確的。

abstract class A<T extends SomeType> { 

    abstract T foo(); 
} 

靜態類型爲A的對象預計將符合由該類聲明的界限:

A<?> a = ...; 
SomeType someObject = a.foo(); 

不過,如果B與摒棄考慮A返回T聲明的方法這些邊界:

abstract class B<T> extends A<T> { } 

class C extends B<String> { 

    @Override 
    String foo() { 
     return "foo"; 
    } 
} 

我們有亂:

A<?> a = new C(); 
SomeType someObject = a.foo(); // ??? 
+0

噢好吧,從來沒有想過做這樣的濫用,但我可以理解爲什麼它不可能實現。謝謝!! – MikioBo

0

你的問題是相當混亂,多爲不正確使用的一些術語,但如果我理解正確的話,下面的例子看起來像你描述你想做的事:

class A<T extends CharSequence> { } 
class B extends A<String> { } 

所以,根據你的問題,類A有一個類型參數,CharSequence的上界爲,而類B(它擴展了A)完全沒有類型參數。