簡體   English   中英

無法從通用方法返回對象

[英]Cannot return object from generic method

我不明白為什么以下代碼無法編譯。 我已經聲明了泛型T ,它擴展了Customer Customer是類型的Customer ,為什么我不能返回Customer沒有一個演員是這個方法的對象?

public class CustomerExample {

    public <T extends Customer> T processCustomer(Customer customer) {
        return new Customer();
    }
}

class Customer {

}

我得到java: incompatible types: Customer cannot be converted to T

您需要顯式轉換:

public <T extends Customer> T processCustomer(Customer customer) {
    return (T) new Customer();
}

當然, 您需要知道運行時的這種類型轉換 ,因為您不能這樣做:

class Client extends Customer {
}

這樣,以下調用將在運行時因類強制轉換異常而失敗:

Client client = new CustomerExample().processCustomer(new Client());

那是因為運行時類不匹配。 這僅意味着您對processCustomer的實現必須有效地是通用的(無論如何都不能綁定到一個靜態類型)

假設您使用以下方法調用了方法:

Customer customer = ...
SomeCustomerSubClass c = processCustomer(customer);

在這種情況下,編譯器期望processCustomer返回SomeCustomerSubClass ,因此它不能允許您的processCustomer返回Customer

如果要返回Customer實例,則應該問自己為什么首先使用通用類型參數。

請記住,作為方法的作者,您不必決定方法的通用參數是什么。 您不能斷言T 必須是 Customer 呼叫者可以。

在您的情況下,您將T限制為CustomerCustomer本身的子類。 但是,您返回一個Customer實例。 如果調用方將T指定為AngryCustomerCustomer的子類),則這將產生矛盾。 呼叫者希望您返回AngryCustomer但是您返回了Customer

要解決此問題,您可以將extends更改為super以便T可以是CustomerCustomer本身的任何超類。 現在這一切都說得通了。 如果調用方將T指定為Object ,則Customer類型與Object兼容,但與AngryCustomer不兼容。

另外,根本不要使用泛型。 您當前對這種方法的實現似乎不適合通用。

T擴展CustomerCustomer不擴展T

在您的實際代碼中:

public <T extends Customer> T processCustomer(Customer customer) {
    return new Customer();
}

您在方法中返回一個超類實例( Customer ),該方法將其子類( T )聲明為返回類型。
如果不進行向下轉換,則這樣做是無效的,因為將超類變量分配給子類變量是無效的,例如:

T t = customer;

您應該寫:

T t = (T)customer;  

因此,您還需要在此處強制轉換為T

public <T extends Customer> T processCustomer(Customer customer) {
    return (T) new Customer();
}

很簡單, 客戶不執行T

例如讓我們創建T像:

class T extends Customer {
    int i;
    public T(int i) {
        this.i = i;
    }
}

您想如何使用客戶創建T 是不可能的。

暫無
暫無

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

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