Java 使用类<;?实例化参数化类型类&燃气轮机;变量

Java 使用类<;?实例化参数化类型类&燃气轮机;变量,java,generics,parameterized-types,Java,Generics,Parameterized Types,(注意:我在这个类似的领域中搜索了多个问题,但我从未遇到过与我的想法相关的答案) 考虑我是否有一个类或枚举Foo,其中每个实例都有一个类类型字段: public enum Foo { A (Integer.class), B (Double.class), C (String.class); public final Class<?> type; Foo(Class<?> type) { this.type = type;

(注意:我在这个类似的领域中搜索了多个问题,但我从未遇到过与我的想法相关的答案)

考虑我是否有一个类或枚举
Foo
,其中每个实例都有一个
类类型
字段:

public enum Foo {
    A (Integer.class), B (Double.class), C (String.class);

    public final Class<?> type;

    Foo(Class<?> type) {
        this.type = type;
    }
}
公共枚举Foo{
A(Integer.class)、B(Double.class)、C(String.class);
公共期末班类型;
Foo(类类型){
this.type=type;
}
}
然后我有一个通用类
Bar

公共类栏{
私人价值;
//默认构造函数
公共栏(){}
//吸气剂
public V getValue(){
返回值;
}
//塞特
公共无效设置值(V值){
这个值=值;
}
}
在不知道
Foo.type
的具体类型的情况下,是否可以使用给定
Foo
Class type
字段中的类型实例化
Bar
的实例?例如,我会在静态方法或某种工厂方法中调用它

编辑:


要指定Bar的函数,Bar使用一个简单的getter/setter包装一个值,并且有一个一致的接口,但类型未知。我的想法的好处是基于Foo实例创建Bar实例。例如,使用
Foo.A.type
(即
Integer.class
)的值来实例化
Bar
,而事先不知道
Foo.A.type
具有
Integer.class
的值,以便实例化一个新的
Bar
对象,您需要类型为
V
的对象

因此,您的问题转化为实例化
Class
类型的对象。更具体地说,假设一个现有的
Foo
对象和
Foo
类中的
getType()
方法,您可以执行如下操作:

Foo foo = ... // Existing Foo object
Class<V> type = foo.getType();
V value = instantiate(type); // TODO: Implement instatiate()
Bar<V> bar = new Bar(value);

不过,并非所有类都有默认构造函数,因此没有针对所有情况的通用解决方案。

问题在于
Foo
中的
type
被声明为
Class
,因此需要对
Class
进行强制转换,这会由于未选中强制转换而引发警告。接下来,您还应该将菱形操作符添加到
新条(值)
的实例化中。您还可以将强制转换重构为枚举本身,如
@SuppressWarnings(“unchecked”)公共类getType(){return(Class)type;}
,然后只使用
类type=Foo.C.getType()之类的东西Class type=Foo.B.getType()然后在运行时失败。很抱歉,我的构造函数示例有误导性。重点不是初始化值,而是在不明确知道类型的情况下创建一个新的Bar实例,而是使用来自Foo的类型。我已经编辑了我的示例。那么,您需要更具体地说明V的用法。它是Bar类的任何方法的返回值吗?这是它的变量类型吗?我写了更多关于
V
用法的解释
Bar
是一个包装类,要点是使用
Foo
的实例来实例化
Bar
,其中
V
Foo.a.type
Foo.B.type
是同一类。同样,也可以在类中不进行硬编码的情况下执行此操作。(也就是说,我事先不知道
Foo.A
的类型,但我通过
type
字段知道它是什么。我不想只做
Bar=newbar();
,而是想以某种方式将
Foo
实例的
type
字段引用的类传递给我创建的条。
Foo foo = ... // Existing Foo object
Class<V> type = foo.getType();
V value = instantiate(type); // TODO: Implement instatiate()
Bar<V> bar = new Bar(value);
V value = type.newInstance();