有没有办法在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(){
返回克拉斯;
}
}
两个问题:

  • 如果我只有一门课,有没有办法去上课?不幸的是,Foo是一个私有类,因此唯一具有全局性(即了解T将是什么)的代码不能了解Foo,因此不能给我类
  • 我有没有更好的办法
  • 谢谢

    另外,对于那些需要更多细节的人,我们开始吧。完整的故事是Foo和FooFactory都是外部类中的私有类。Foo在整个外部类中广泛使用,为了避免虚假的垃圾收集,我想使用ObjectPool来实例化Foo的实例,而不是更新它们并一直对它们进行垃圾收集。然而,为了使用我的ObjectPool,我需要一个工厂,在Outer内部,我显然不知道当Outer被实例化时t是什么

    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:Try
    return(Class)klass
    并取消显示
    rawtypes
    警告。@Woot4Moo:我同意你的意见,但在这种情况下不同意。生成警告是因为OP需要违反代码中的泛型规则,而他必须禁止这些规则的原因是Java没有提供一种在不违反规则的情况下实现其所需的方法。作为参考,Java在您编写
    t
    的所有地方都使用
    Object
    ,这在一般情况下并不完全正确。例如,如果您有上下文
    ,那么Java将用
    Comparable
    ,而不是
    Object
    ,代替
    T
    。这对newInstance()方法有效,但对getKlass()方法没有帮助。编译器不允许从一个类转换到另一个类,这是必需的返回类型