簡體   English   中英

如何使“通用方法聲明”接受子類

[英]How to make "generic method declaration" to accept subclasses

我有一個接口方法:

List<User> getUsers(Query query);

及其實施:

List<User> getUsers(Query query){
..
return users;
}

我可以毫無問題地使用它:

Query q = new Query(..);
List<User> users = getUsers(q);

現在我創建一個 Query 的子類:

class UserQuery extens Query{..}

並希望將此子類的實例傳遞給 getUsers() 方法:

UserQuery uq = new UserQuery(..);
List<User> users = getUsers(uq); // does not work, as getUsers accepts only "Query"-objects

正如接口中定義的那樣,getUsers() 只接受“查詢”對象而不是它的子類。

如何使該方法更通用,以便它可以接受 Query-Objects 及其所有子類?

我試過了,但在 Java 中是不可能的:

界面:

// is not possible in java
List<User> getUsers(<E extends Query> query);

// also not possible in java
List<User> getUsers(Object<? extends MarketdataQuery> query);

執行:

// is not possible in java
List<User> getUsers(<E extends Query> query){
..
return users;
}

**

編輯:

**

它僅在我傳遞“查詢”對象時才有效:

// This works: 
Query q = new UserQuery(..); 
List<User> users = getUsers(q);


// This does not work:
UserQuery uq = new UserQuery(..);
List<User> users = getUsers(uq);

獲取實際的查詢對象,我必須使用強制轉換,所以我不能將 UserQuery 傳遞到方法中..

List<User> getUsers(Query query){
    UserQuery uq = (UserQuery) query;
    return users;
}

您可以泛型方法,而不僅僅是參數。 這將完成以下工作:

<E extends Query> List<User> getUsers(E query);

現在query可以是Query類型或它的任何其他子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM