[英]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
限制為Customer
或Customer
本身的子類。 但是,您返回一個Customer
實例。 如果調用方將T
指定為AngryCustomer
( Customer
的子類),則這將產生矛盾。 呼叫者希望您返回AngryCustomer
但是您返回了Customer
!
要解決此問題,您可以將extends
更改為super
以便T
可以是Customer
或Customer
本身的任何超類。 現在這一切都說得通了。 如果調用方將T
指定為Object
,則Customer
類型與Object
兼容,但與AngryCustomer
不兼容。
另外,根本不要使用泛型。 您當前對這種方法的實現似乎不適合通用。
T
擴展Customer
但Customer
不擴展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.