好吧,这个问题说明了一切。这是我想要的一个例子
String s = new String();
List<s.type> ls = new ArrayList<s.type>();
类似的东西,或任何优雅的方式来实现这一点,请不要使用多个 if 条件或条件逻辑,因为可能存在无限的数据类型,我在这里仅使用字符串作为示例,它可以是任何东西。
如果您想获取 s 的运行时类型并在泛型中使用它,这是不可能的。Java 中的泛型仅在编译时用于类型检查和类型推断。List<String>
泛型的信息在运行时被擦除,所以运行时无法分辨和之间的区别List<Integer>
。
如果你只是想用 s 的编译时已知类型创建一个泛型,那么它没有意义,因为你已经知道 s 的类型并且你可以为它写一个类名。
如果我理解正确,您想知道运行时(现有)中实例(对象)的类(类型) ,但正如 Petr 解释的那样,这与泛型无关。
public class Types {
public static void main(String[] args) {
String s = "";
Runtime r = Runtime.getRuntime();
Types t = new Types();
List<Class> types = new LinkedList<Class>();
types.add(Integer.class);
types.add(t.getClass());
types.add(r.getClass());
types.add(s.getClass());
for (Class type :types) {
System.out.println(type.getSimpleName());
}
}
}
输出:
Integer
Types
Runtime
String
但是,很少需要这种方法,因此请重新考虑是否有更简单的解决方案来解决您的问题。如果你仍然想这样处理它:
编辑:
您的问题的另一种解释导致动态通用列表作为答案:
public static <T> List<T> createListOfType() {
return new ArrayList<T>();
}
public static void main(String[] args) {
List<String> a = createListOfType();
List<Integer> b = createListOfType();
a.add("");
b.add(2);
a.add(2); // remove this line to compile
b.add(""); // remove this line to compile
}