簡體   English   中英

從接口返回類型的通用方法

[英]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的子類型並且只返回它獲得的客戶端實例時,我會遇到編譯錯誤。 我想要的是統一T1T2

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.

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