将运行时解析的参数传递给具有多个绑定类型的方法,编译错误

将运行时解析的参数传递给具有多个绑定类型的方法,编译错误,第1张

将运行时解析的参数传递给具有多个绑定类型的方法,编译错误

您需要对泛型辅助方法使用未经检查的演员表:

private static <T extends Enum<T> & Marshallable> void fooHelper(Class<? extends Marshallable> type) {    if (type.isEnum()) {        //This is safe because of the isEnum check, and we don't return any        //type with T (important because the caller can specify what T is).        @SuppressWarnings("unchecked")        final Class<T> enumType = (Class<T>)type;        final List<T> enumConstants = Arrays.asList(enumType.getEnumConstants());        foo(enumConstants);    }}

您的版本不工作的原因是因为

T extends Enum<T> & Marshallable
T
递归的约束-
这只能与类型的参数来表示。中的通配符类型参数
? extends Enum<? extends Marshallable>
不再指定该关系。

警告: 务必

fooHelper
不要返回包含的类型,
T
因为这可能导致堆污染。例如:

private static <T extends Enum<T> & Marshallable> List<T> unsafeFooHelper(Class<? extends Marshallable> type) {    if (type.isEnum()) {        //no longer safe!        @SuppressWarnings("unchecked")        final Class<T> enumType = (Class<T>)type;        return Arrays.asList(enumType.getEnumConstants());    }    return Collections.emptyList();}enum Enum1 implements Marshallable { ONE, TWO }enum Enum2 implements Marshallable { A, B }...//caller lies about what T is:List<Enum2> enumConstants = Main.<Enum2>unsafeFooHelper(Enum1.class);//sometime later...Enum2 enumConstant = enumConstants.get(0); //ClassCastException


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5500103.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存