一尘不染

Java动态泛型键入

java

如果我有一个使用通用类型的类,例如

public class Record<T> {
    private T value;

    public Record(T value) {
        this.value = value;
    }
}

如果我知道使用的所有类型(例如本例中的情况),那么在设计时就可以直接键入所有内容:

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

如果从“我不知道类型”的“某处”获得对象列表会怎样?如何分配类型:

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

阅读 239

收藏
2020-09-08

共1个答案

一尘不染

Java泛型不是C ++模板。

Java泛型是编译时功能,而不是运行时功能。

这是Java泛型教程的链接。

这永远无法与Java一起使用:

new Record<object.getClass()>(object);

您必须使用多态(例如,每个对象都实现一个已知的接口)或RTTI(instanceof或Class.isAssignableFrom())。

您可以这样做:

     class Record
     {
       public Record(String blah) { ... }
       public Record(Integer blah) { ... }
       ... other constructors.
     }

或者您可以使用Builder模式

2020-09-08