2012-09-18 117 views
1

我有下面的類層次結構。綁定不匹配泛型

一流

class First<T> { 
} 

二等

class Second<T> extends First<T> { 

} 

三等

class Third<T extends First<T>> { 
} 

錯誤行:

Third<Second<String>> name = new Third<Second<String>>();//Compilation error 

Bound mismatch: The type Second<String> is not a valid substitute for the bounded parameter <T extends First<T>> of the type Third<T>

我與上述錯誤真的很困惑。你能解釋爲什麼這個編譯錯誤發生?

回答

2

T extends First<T>Second<String>不一樣,因爲T與String以及延伸First<T>的東西都是綁定的。

我必須要在三到使用不同的參數的感覺,在你的作業做這樣

class Third<T extends First<?>> { 
} 
+0

你也可以做'第三個>' –

+0

'第三個> {}'給出編譯錯誤。 –

0

東西的困惑是,在TSecondStringTThirdSecond<String>。因此,爲了使作業有效,Second<String>應延伸至First<Second<String>>。但情況並非如此,因爲Second<String>延伸First<String>。下面的代碼編譯爲預期:

public class Test { 

    static class First<T> { 
    } 

    static class Second<T> extends First<Second<T>> { 
    } 

    static class Third<T extends First<T>> { 
    } 

    public static void main(String... args) { 
     Third<Second<String>> name = new Third<Second<String>>(); 
    } 
} 
1

奧古斯托是在正確的軌道上,但要避免使用通配符?你可以另一種類型的參數添加到您的類Third

class Third<U, T extends First<U>> { 
    // ... 
} 

Third<String, Second<String>> name = new Third<>(); 

的缺點是,您必須在類型參數中提及String兩次。