我有一种方法fetchObjects(String)
可以返回一组Contract
业务对象。该className
参数告诉我应该返回哪种业务对象(当然,在这种解释的情况下,这没有意义,因为我已经说过我将返回Contract
s,但这实际上是我的实际情况)。因此,我从某处获取了一组条目,并加载了集合条目的类(其类型由指定className
)。
现在,我需要构造要返回的数组,因此我使用Set
的toArray(T[])
方法。使用反射,我为自己建立了一个空的Contracts数组。但是,这给了我一个静态类型的值Object
!因此,接下来我需要将其转换为适当的类型,在这种情况下,该类型是正确的类型Contract[]
(请参见下面清单中“带下划线的”部分)。
我的问题是:是否有一种方法以及如何强制转换Contract[]
为列表中的方法,但是Contract
只能通过className
(或entriesType
)确定数组元素()的类型?换句话说,我想做的基本上是这样的转换:(entriesType[]) valueWithStaticTypeObject
将entrysType替换为通过classname
参数指定的类,即Contract
。
这在某种程度上是天生不可能的,还是可以以某种方式做到?也许使用泛型?
package xx.testcode;
import java.util.HashSet;
import java.util.Set;
class TypedArrayReflection {
public static void main(String[] args) {
try {
Contract[] contracts = fetchObjects("Contract");
System.out.println(contracts.length);
} catch (ClassNotFoundException e) {}
}
static Contract[] fetchObjects(String className) throws ClassNotFoundException {
Class<?> entriesType = Class.forName("xx.testcode."+className);
Set<?> entries = ObjectManager.getEntrySet(className);
return entries.toArray(
(Contract[]) java.lang.reflect.Array.newInstance(
/********/ entriesType, entries.size()) );
}
}
class Contract { } // business object
class ObjectManager {
static Set<?> getEntrySet(String className) {
if (className.equals("Contract"))
return new HashSet<Contract>();
return null; // Error
}
}
谢谢。
toArray
取自 CodeIdol 的类型安全方法 , fetchObjects
因此更新了我的 方法:
static Contract[] fetchObjects(String className) throws ClassNotFoundException {
Class<?> entriesType = Class.forName("xx.testcode."+className);
Set<?> entries = ObjectManager.getEntrySet(className);
return toArray(entries, entriesType); // compile error
// -> "method not applicable for (Set<capture#3-of ?>, Class<capture#4-of ?>)"
}
public static <T> T[] toArray(Collection<T> c, Class<T> k) {
T[] a = (T[]) java.lang.reflect.Array.newInstance(k, c.size());
int i = 0;
for (T x : c)
a[i++] = x;
return a;
}
我要怎么做才能摆脱注释中引用的编译器错误?我是否绝对必须Set<Contract>
在方法的返回类型中指定getEntrySet
它才能起作用?感谢您的指导。
您可以使用类作为参数,而不是类名称。
static <T extends Contract> T[] buildArray(Class<T> clazz){
ArrayList<T> l=new ArrayList<T>();
return l.toArray((T[]) java.lang.reflect.Array.newInstance(clazz, l.size()));
}
编辑:(阅读杨评论后)
不,您不能将泛型类型与变量的值一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句