Java中的动态通用键入 [英] Dynamic Generic Typing in Java
问题描述
如果我有一个使用泛型类的类,比如
public class Record< T> {
私人T值;
公共记录(T值){
this.value = value;
$ b $ p
$ b 在设计时输入所有内容非常简单,如果我知道使用的所有类型,例如在这个例子中就是这种情况:
//我显式键入
String myStr =A;
Integer myInt = 1;
ArrayList myList = new ArrayList();
记录rec1 =新记录< String>(myStr);
记录rec2 =新记录<整数>(myInt);
记录rec3 =新记录< ArrayList>(myList);
如果我从某处得到一个我不知道类型的对象列表,会发生什么情况?我该如何分配类型:
//现在让我们假设我的值来自一个我只在运行时知道的列表类型他们有
ArrayList< Object> myObjectList = new ArrayList< Object>();
myObjectList.add(myStr);
myObjectList.add(myInt);
myObjectList.add(myList);
Object object = myObjectList.get(0);
//这个失败 - 我该怎么做?
新记录< object.getClass()>(object);
解决方案 Java泛型不是C ++模板。
Java泛型是编译时功能,而不是运行时功能。
这里是 Java泛型教程。
这对Java无法使用:
新记录< object.getClass()>(object);
您必须使用多态(比如每个对象实现一个已知的接口)或RTTI(instanceof或Class
您可以这样做:
类记录
{
public Record(String blah){...}
public Record(Integer blah){...}
...其他构造函数。
}
或者您可以使用构建模式。
If I have a class using generic type such as
public class Record<T> {
private T value;
public Record(T value) {
this.value = value;
}
}
it is pretty straight forward to type everything during design time, if I know all types that are used such as it is the case in this example:
// I type explicitly
String myStr = "A";
Integer myInt = 1;
ArrayList myList = new ArrayList();
Record rec1 = new Record<String>(myStr);
Record rec2 = new Record<Integer>(myInt);
Record rec3 = new Record<ArrayList>(myList);
What happens if I get a list of objects from "somewhere" where I don't know the type? How do I assign the type:
// now let's assume that my values come from a list where I only know during runtime what type they have
ArrayList<Object> myObjectList = new ArrayList<Object>();
myObjectList.add(myStr);
myObjectList.add(myInt);
myObjectList.add(myList);
Object object = myObjectList.get(0);
// this fails - how do I do that?
new Record<object.getClass()>(object);
解决方案 Java generics are not C++ Templates.
Java generics are a compile time feature, not a run time feature.
Here is a link to the Java generics Tutorial.
This can never work with Java:
new Record<object.getClass()>(object);
You must either use polymorphism (say, each object implements a known interface) or RTTI (instanceof or Class.isAssignableFrom()).
You might do this:
class Record
{
public Record(String blah) { ... }
public Record(Integer blah) { ... }
... other constructors.
}
or you might use the Builder pattern.
这篇关于Java中的动态通用键入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!