如果我有一个使用通用类型的类,例如
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);
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模式。