2

以前のJava1.4コードを1.5でコンパイルしようとすると、このジェネリックスのバインドの不一致の問題が発生しました。コードを以下に示します

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

エラーは:

バインドの不一致:Subject型のジェネリックメソッドgetPrincipals(Class<T>)は、引数には適用できません(Class<capture#1- of ?>)。推論された型capture#1-of ?は、制限されたパラメーターの有効な代替ではありません<T extends Principal>

4

1 に答える 1

5

Javadocを見ると、 が-- つまり、のサブクラスを表すオブジェクトgetPrincipals()を取るように定義されていることがわかります。たとえば、次のメソッドを使用して、コードでこれを考慮する必要があります。Class<T extends Principal>ClassPrincipalasSubclass()

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 に答える