gpt4 book ai didi

java - 类型安全代理创建

转载 作者:行者123 更新时间:2023-12-01 17:59:25 25 4
gpt4 key购买 nike

假设我有两种方法:

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
);
}

上面的不是类型安全的,我收到警告

unchecked cast 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)不一定不安全(尽管它仍然是一个 Actor )。该警告仅意味着此时没有实际的转换,因为没有对 T 的实际类的内置引用。 .

我发现您还传递了 Class<T>到方法。您可以使用它来手动执行检查强制转换,类似于您的第二个片段:

private <T> T testGenericsT(Class<T> clazz) {
Class<?>[] classArray = {clazz};
return clazz.cast(newProxyInstance(
clazz.getClassLoader(),
classArray,
(proxy, method, args) -> null
));
}

关于java - 类型安全代理创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42226031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com