[英]Generic method with return type from interface
我有一個接口和一個看起來像這樣的值類:
public interface ITest<T1> {
<T2> T1 test(OtherClass<T2> client);
}
基本上,它表示子類型必須實現返回T1的方法test
,無論實現子類型中是什么。
OtherClass:
public class OtherClass<T> {
public T contents;
}
但是,當我想編寫一個實現test
的子類型並且只返回它獲得的客戶端實例時,我會遇到編譯錯誤。 我想要的是統一T1
和T2
:
public class Test<T1> implements ITest<T1> {
@Override
public <T1> T1 test(OtherClass<T1> client) { // compile error
return client.contents;
}
}
有沒有辦法讓這個班上班?
我不認為認為這是允許的,因為你現在限制T2
是一個T1
類中的Test<T1>
您可以按如下方式解決此問題:
public interface ITest<T1, T2> {
T1 test(OtherClass<T2> client);
}
public class OtherClass<T> {
public T contents;
}
public class Test<T1> implements ITest<T1, T1> {
@Override
public T1 test(OtherClass<T1> client) {
return client.contents;
}
}
<T1>
基本上告訴任何一個班級“你選擇T1將是什么類型!”。 這意味着在這種情況下, <T1>
和OtherClass<T1>
指的是相同的類型,而返回類型T1
指的是類的T1
。 如果重命名,您將看到錯誤:
@Override
public <OtherClassType> T1 test(OtherClass<OtherClassType> client) {
return client.contents; //you can't do that without casting OtherClassType to T1
}
如果你不能編輯ITest
接口,那么編譯它的唯一方法就是通過強制轉換,但你需要確保在執行之前可以實際執行(因為OtherClass可以返回任何類型,不一定是T1的子類)。
編輯:編譯器不允許這樣做的確切原因是因為您實際上限制了test
方法只接受某些類型,而它重寫的方法允許任何類型。
在您的接口聲明中,您說您希望test
函數接受任何類型(您沒有為T2
指定任何邊界)。
在您的實現中,您只接受T1
,這不是任何類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.