簡體   English   中英

Paramterized類,如何引用作為paramterized類型傳遞的paramterized類型的東西

[英]Paramterized class, how to reference the paramterized type of something passsed as a paramterized type

對不起,如果標題很糟糕,不知道怎么問這個問題......

假設我有一些接口Foo,它接受一個參數

  public interface IFoo<Bar extends IBar>{

      public Bar generateBar();
  }

我有另一個類,它接受一個foo對象並生成一個bar對象。 我可以像這樣定義它。

 public class FooBar<Bar extends IBar, Foo extends IFoo<Bar>>{

      private Foo foo;

      public FooBar(Foo foo){
          this.foo = foo;
      }

      public Bar getBar(){
           this.foo.generateBar();
      }

一切正常。 但是,將Bar定義為我的FooBar類的參數似乎很愚蠢。 IFoo對象將被參數化以獲取Bar值,因此我假設我可以從Foo對象具有的任何參數推斷Bar的類型; 從而避免每次定義FooBar對象時必須提供兩個參數。

有沒有辦法可以做到這一點? 而不是使Bar成為FooBar參數化類型的一部分,只是從Foo的參數推斷它?

編輯:答案似乎是無法完成,正如已經回答的那樣。 但是,我打算將這個開放一天,因為我希望有人可以發布一個答案,不僅可以做到,而且為什么不可能。 具體來說,這只是java開發人員從未選擇支持的用例,或者是否有一個原因使得支持其他參數化檢查的相同編譯時類型檢查不可能通過查看特定的IFoo類型參數來推斷Bar類型。 編譯器不能確定IFoo參數和任何參數化類型嗎?

如果你關心IFoo的實際類型參數,那么你所擁有的是正確的 - 聲明類型參數Bar因此在聲明Foo時它可以是IFoo的類型參數。

但是,如果您不關心代碼中IFoo的類型參數是什么,那么您可以消除Bar類型參數並使用通配符綁定將類型參數替換為IFoo

class FooBar<Foo extends IFoo<? extends IBar>>{

你的getBar方法需要返回一個IBar

public IBar getBar(){
    return this.foo.generateBar();
}

為了擁有一個創建Bar對象的方法,您需要一個Class<Bar>類型的對象。 然后你可以使用:

class FooBar ...{
    Class<Bar> barClass = ...;

    public Bar getBar(){
         return barClass.newInstance();
    }
}

有各種方法來獲得barClass。 我不確定要推薦什么設計,因為你給了我們任意類型的Foo,Bar等。

更通用的解決方案是:

class FooBar<T> ...{
        Class<T> someClass = ...;

        public T getInstance(){
             return someClass.newInstance();
        }
    }

您需要以某種方式將Class<Bar>作為參數傳遞。

據推測,你的getBar方法將返回一個Bar。 由於類型擦除,您無法推斷類型。 你可以返回一個裸的對象進行投射,但這相當違背了泛型的目的。

回答我自己的問題,只是提到我在特定情況下使用的方法,因為我想做的事情無法完成。 老實說,這很簡單,所以我應該先嘗試一下,但是我想知道參數化可以做些什么。

我的FooBar等價物現在看起來像這樣:

public class FooBar<Bar extends IBar>{

  private IFoo<Bar> foo;

  public FooBar(IFoo<Bar> foo){
      this.foo = foo;
  }

  public Bar getBar(){
       this.foo.generateBar();
  }

暫無
暫無

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

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