簡體   English   中英

有沒有辦法在Java中獲取類或實例化雙重泛型類型?

[英]Is there any way to get a class for or instantiate a doubly-generic type in Java?

所以說我有:

public class Foo<T> {
  // Some stuff
}

public interface Factory<T> {
  T newInstance();
  Class<T> getKlass();
}

我想要實現Factory來構建Foo <T>:

public class FooFactory<T> implements Factor<Foo<T>> {
  private Class<Foo<T>> klass;
  public FooFactory(Class<Foo<T>> klass) {
    this.klass = klass;
  }

  public T newInstance() throws Exception {
    return klass.newInstance();
  }

  public Class<Foo<T>> getKlass() {
    return klass;
  }
}

兩個問題:

  1. 如果我所有的都是Class <T>,有沒有辦法讓我獲得Class <Foo <T >>? 不幸的是,Foo是一個私有類,因此唯一具有整體畫面的代碼(即知道T將是什么)無法知道Foo,因此不能給我Class <Foo <T >>。
  2. 有沒有更好的方法來解決這個問題?

謝謝!

PS對於那些要求更多細節的人,我們走了。 完整的故事是Foo和FooFactory都是外部類中的私有類。 Foo在整個外部類中被廣泛使用,為了避免虛假的垃圾收集,我想使用ObjectPool來實例化Foo的實例而不是新建它們並一直收集垃圾。 但是,為了使用我的ObjectPool,我需要一個Factory <Foo <T >>,而在Outer <T>里面,當Outer <T>被實例化時,我顯然不知道T將是什么。

public class Outer<T> {
  private class Foo<T> { ... }
  private class FooFactory<T> {...}

  private ObjectPool<Foo<T>> fooPool;

  ...
}

有一些方法可以為Class<Foo<T>>創建類型信息但是要做你想做的事情,你只需要在FooFactory禁止所有泛型警告。

在運行時,Java在您編寫T所有位置使用Object ,因此您可以簡單地實例化Foo<Object>Foo.class ,它們是相同的。 這稱為類型擦除

泛型只是編譯器的一個提示。 由於您的API確保使用FooFactory所有代碼都將FooFactory類型T ,因此您可以禁止警告並使用適當的強制轉換,它將起作用。

注意:如果要保留類型信息,請實現ParameterizedType接口

只有一個Foo類對象,它等於Foo.class 雖然你可以編寫Class<Foo<whatever>> ,但這是一種欺騙性的,因為它是完全相同的Foo類對象。 當然,你需要Class<Foo<T>>才能調用newInstance()並得到一個Foo<T> 因此,為了解決您需要Class<Foo<T>>並且Foo.class類型為Class<Foo>的事實,您只需要進行一些轉換:

public FooFactory() {
  this.klass = (Class<Foo<T>>)(Class<?>)Foo.class;
}

請注意,我們根本不需要Class<T> ,因為您不需要知道T來創建Foo<T>

暫無
暫無

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

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