-1

好吧,这个问题说明了一切。这是我想要的一个例子

String s = new String();
List<s.type> ls = new ArrayList<s.type>();

类似的东西,或任何优雅的方式来实现这一点,请不要使用多个 if 条件或条件逻辑,因为可能存在无限的数据类型,我在这里仅使用字符串作为示例,它可以是任何东西。

4

2 回答 2

5

如果您想获取 s 的运行时类型并在泛型中使用它,这是不可能的。Java 中的泛型仅在编译时用于类型检查和类型推断。List<String>泛型的信息在运行时被擦除,所以运行时无法分辨和之间的区别List<Integer>

如果你只是想用 s 的编译时已知类型创建一个泛型,那么它没有意义,因为你已经知道 s 的类型并且你可以为它写一个类名。

于 2013-01-15T18:36:22.767 回答
0

如果我理解正确,您想知道运行时(现有)中实例(对象)的类(类型) ,但正如 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       
}
于 2013-01-15T18:48:09.687 回答