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();