2

当我尝试在 1.5 中编译我以前的 java 1.4 代码时,我遇到了这个泛型绑定不匹配问题。代码如下

try {
    ArrayList simplePrincipals = new ArrayList(
            ((java.util.Collection) (subject.getPrincipals(Class
                    .forName("com.efunds.security.jaas.SimplePrincipal")))));
    if (simplePrincipals.size() > 0) {
        ((SimplePrincipal) simplePrincipals.get(0))
                .setPermissions(webPerm);
    }
}

错误是:

绑定不匹配:getPrincipals(Class<T>)Subject 类型的泛型方法不适用于 arguments (Class<capture#1- of ?>)。推断的类型capture#1-of ?不是有界参数的有效替代品<T extends Principal>

4

1 回答 1

5

如果您查看Javadocs,您会发现它getPrincipals()现在被定义为采用Class<T extends Principal>- 即Class表示Principal. 您的代码必须考虑到这一点,例如,通过使用以下asSubclass()方法:

String className = "com.efunds.security.jaas.SimplePrincipal";
Class<? extends Principal> clazz =
    Class.forName(className).asSubclass(Principal.class); 
ArrayList<Principal> simplePrincipals =
    new ArrayList<Principal>(subject.getPrincipals(clazz));

请注意,您的强制转换Collection以及大多数括号都是不必要的。

于 2012-05-25T13:18:10.960 回答