[英]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;
}
}
兩個問題:
謝謝!
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.