有没有办法在Java中为双泛型类型获取类或实例化双泛型类型?
所以说我有:有没有办法在Java中为双泛型类型获取类或实例化双泛型类型?,java,generics,factory-pattern,nested-generics,Java,Generics,Factory Pattern,Nested Generics,所以说我有: public class Foo<T> { // Some stuff } public interface Factory<T> { T newInstance(); Class<T> getKlass(); } 公共类Foo{ //一些东西 } 公共接口工厂{ T newInstance(); 类getKlass(); } 我想实现Factory来构建Foos: 公共类FooFactory实现因子{ 私家级卡拉斯; 公共食品
public class Foo<T> {
// Some stuff
}
public interface Factory<T> {
T newInstance();
Class<T> getKlass();
}
公共类Foo{
//一些东西
}
公共接口工厂{
T newInstance();
类getKlass();
}
我想实现Factory来构建Foos:
公共类FooFactory实现因子{
私家级卡拉斯;
公共食品工厂(klass级){
this.klass=klass;
}
public T newInstance()引发异常{
返回klass.newInstance();
}
公共类getKlass(){
返回克拉斯;
}
}
两个问题:
public class Outer<T> {
private class Foo<T> { ... }
private class FooFactory<T> {...}
private ObjectPool<Foo<T>> fooPool;
...
}
公共类外部{
私有类Foo{…}
私有类FooFactory{…}
私有对象池;
...
}
有多种方法可以为类创建类型信息,但要执行所需操作,只需在FooFactory
中抑制所有泛型警告即可
在运行时,Java在您编写T
的所有地方都使用Object
,因此您可以简单地实例化Foo
或Foo.class
,它们是相同的。这就是所谓的
泛型只是编译器的提示。由于您的API确保所有使用foodfactory
的代码都符合T
类型,因此您可以抑制警告并使用适当的强制转换,它将正常工作
注意:如果要保留类型信息,请执行。有多种方法可以为类创建类型信息,但要执行所需操作,只需在FooFactory中取消所有泛型警告
在运行时,Java在您编写T
的所有地方都使用Object
,因此您可以简单地实例化Foo
或Foo.class
,它们是相同的。这就是所谓的
泛型只是编译器的提示。由于您的API确保所有使用foodfactory
的代码都符合T
类型,因此您可以抑制警告并使用适当的强制转换,它将正常工作
注意:如果要保留类型信息,请实现。只有一个Foo
class对象,它等于Foo.class
。虽然您可以编写Class
,但这有点欺骗性,因为它都是相同的Foo
Class对象。当然,您需要Class
才能调用newInstance()
并获得Foo
。因此,为了避免您需要一个类
,并且Foo.Class
具有类型类
,您只需进行一些转换:
public FooFactory() {
this.klass = (Class<Foo<T>>)(Class<?>)Foo.class;
}
publicfoofactory(){
this.klass=(Class)(Class)Foo.Class;
}
请注意,我们根本不需要Class
,因为创建Foo
只需要一个Foo
类对象,它等于Foo.Class
。虽然您可以编写Class
,但这有点欺骗性,因为它都是相同的Foo
Class对象。当然,您需要Class
才能调用newInstance()
并获得Foo
。因此,为了避免您需要一个类
,并且Foo.Class
具有类型类
,您只需进行一些转换:
public FooFactory() {
this.klass = (Class<Foo<T>>)(Class<?>)Foo.class;
}
publicfoofactory(){
this.klass=(Class)(Class)Foo.Class;
}
请注意,我们根本不需要Class
,因为创建Foo
不需要知道t
,上面的代码示例并没有说明您要做什么。您说Foo是私有的,但不提供外部类。添加了一个带有更多解释的postscript。上面代码示例的可能副本并没有说明您要做什么。你说Foo是私有的,但不提供外部类。添加了一个解释更多的postscript。这可能对newInstance()方法有用,但对getKlass()方法没有帮助。编译器不允许从一个类到另一个类进行强制转换,这是必需的返回类型。如果您能解释为什么1)忽略警告是个好主意,2)为什么首先生成警告,我认为OP和社区会更好。我之所以提出这个问题,是因为我看到人们不断地压制警告,它们存在的原因非常明确。@honktronic:Tryreturn(Class)klass
并取消显示rawtypes
警告。@Woot4Moo:我同意你的意见,但在这种情况下不同意。生成警告是因为OP需要违反代码中的泛型规则,而他必须禁止这些规则的原因是Java没有提供一种在不违反规则的情况下实现其所需的方法。作为参考,Java在您编写t
的所有地方都使用Object
,这在一般情况下并不完全正确。例如,如果您有上下文
,那么Java将用Comparable
,而不是Object
,代替T
。这对newInstance()方法有效,但对getKlass()方法没有帮助。编译器不允许从一个类转换到另一个类,这是必需的返回类型