ars*_*265 13 java generics reflection classloader
我之前遇到过一些我在Java中没有遇到过的东西,也就是说,我需要在运行时创建一个新的ArrayList类实例而不分配已知类型然后将数据添加到列表中.这听起来有点模糊,所以这是一个例子:
Class<?> c = i.getClass();
Constructor<?> con = ArrayList.class.getConstructor();
ArrayList<?> al = (ArrayList<?>)con.newInstance();
al.add("something");
Run Code Online (Sandbox Code Playgroud)
现在我这样做而不仅仅使用泛型的原因是因为泛型已经被大量使用而且这个例子中的"i"变量将被用作类型"?".我真的不想投入另一个通用,因为这会给用户带来更多的工作,并且在最终设计中会更不灵活.有没有办法使用下面的东西(注意:下面的内容不起作用).有人有想法吗?
ArrayList<c> al = (ArrayList<c>)con.newInstance();
Run Code Online (Sandbox Code Playgroud)
如果我明白你的意思,你就有了一个C类,它在编译时是未知的,你想以ArrayList<C>类型安全的方式创建一个.这个有可能:
Class<?> c = ...;
ArrayList<?> al = listOf(c);
static <T> ArrayList<T> listOf(Class<T> clazz)
{
return new ArrayList<T>();
}
Run Code Online (Sandbox Code Playgroud)
这是理论上正确的做法.但谁在乎.我们都知道类型擦除,并且Java不会丢弃类型擦除并为类型参数添加运行时类型.所以你可以只使用原始类型并自由投射,只要你知道你在做什么.
| 归档时间: |
|
| 查看次数: |
29980 次 |
| 最近记录: |