想象我有两种方法:类型安全的代理创建
private <T> T testGenericsT(Class<T> clazz) {
Class[] classArray = {clazz};
return (T) newProxyInstance(
clazz.getClassLoader(),
classArray,
(proxy, method, args) -> null
);
}
和:
private AccessibleStreamable testGenerics(Class<AccessibleStreamable> clazz) {
Class[] classArray = { clazz };
return (AccessibleStreamable) newProxyInstance(
clazz.getClassLoader(),
classArray,
(proxy, method, args) -> null
);
}
上一个不是类型安全的,我得到警告
选中投的java .lang.Object to T
但是较低的一个被接受,从我的角度来看,我不确定这些不同在哪里。有没有一种方法可以让鞋帮变得更安全?
我在这里错过了什么,为什么将它投射到AccessibleStreamable而不是T是完全正确的?
我甚至可以改变我的代码,这样
private AccessibleStreamable testGenerics(Class<AccessibleStreamable> clazz) {
Class[] classArray = { List.class };
return (AccessibleStreamable) newProxyInstance(
Map.class.getClassLoader(),
classArray,
(proxy, method, args) -> null
);
}
它仍然不会说任何警告。当然,我不希望它给我一个警告,说我正在对T做一个不加限制的演员阵容。
但是我想我的主要问题是,有没有办法让上面一个安全? (我不通过抑制警告的意思)
不,由于类型删除,没有办法。这就是警告所说的:如果对象不是T的一个实例,那么没有办法让T对象失败,因为T在运行时会被擦除。 –