2017-09-04 32 views
1

我知道泛型類型和通配符類型 之間有什麼區別,但在這種情況下,我不能再以相同的方式再次理解。泛型類型和通配符類型之間爲什麼不同結果輸出

對於短,給兩個接口比較下面

public interface RequestParser { 
    <T extends Entity> Message<T> parseRequest(String json); 
} 


public interface RequestParser { 
    Message<? extends Entity> parseRequest(String json); 
} 

只有第一個可以編譯以下代碼:(用戶延伸實體)

Message<User> message = requestParser.parseRequest(json); 

一個使用通配符?不能成功。

那麼在這種情況下他們之間究竟有什麼不同呢?

+2

的【什麼是佩奇可能的複製(生產者擴展消費超)? ](https://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super) – Flown

+0

在這種情況下,你想使用產生的價值,因此它也是一個消費者(鏈接在重複) – Flown

+0

糟糕,PECS這個詞我從未聽過,謝謝。 –

回答

1

這是因爲Message<User>不是Message<? extends Entity>的子類。

嘗試實施RequestParser時,問題會更加明顯。

這將失敗,但不會強制轉換,因爲T不一定AnotherUser

public class AnotherUser extends Entity {} 

public class RequestParserImpl implements RequestParser { 
    <T extends Entity> Message<T> parseRequest(String json) { 
     return new Message<AnotherUser>(); 
    } 
} 

而這將編譯:

public class RequestParserImpl implements RequestParser { 
    Message<? extends Entity> parseRequest(String json) { 
     return new Message<AnotherUser>(); 
    } 
} 
相關問題