3

我想要一种方法来处理实现特定接口的任何类型的列表。

public interface Encryptable {
    public void encrypt() throws Exception ;
}

class DomainClass implements Encryptable {

    String name ;

    public void encrypt() throws Exception {
        try {
            name = CryptoUtils.encrypt(name);
        } 
    }
}

此实用程序方法可以加密任何实现 Encryptable 的域类的列表。

public static void encryptList ( Collection<? extends Encryptable> listToEncrypt    ) {
    for ( Encryptable objToEncrypt: listToEncrypt ) {
        try {
            objToEncrypt.encrypt() ;
        } catch (Exception e) {
        }
    }
}

我写了一个测试应用程序,这似乎工作。我关心的是Java关键字'extends'。我的类不扩展 Encryptable 他们实现它。我写的东西真的有效吗,还是我是做错事但得到正确答案的某种副作用的受害者。

4

5 回答 5

4

你做对了。这有点模棱两可,但是是的,您是对的。但请记住,您始终可以使用接口而不是类,extends这样才有意义。

于 2013-08-02T14:44:58.523 回答
4

与往常一样,JLS 对此有答案。

有关泛型类型参数的语法,请参见第 8.1.2 节:

TypeParameters:
    < TypeParameterList >

TypeParameterList:
    TypeParameterList , TypeParameter
    TypeParameter

第 4.4 节的语法TypeParameter

TypeParameter:
    TypeVariable TypeBoundopt

TypeBound:
    extends TypeVariable
    extends ClassOrInterfaceType AdditionalBoundListopt

AdditionalBoundList:
    AdditionalBound AdditionalBoundList
    AdditionalBound

AdditionalBound:
    & InterfaceType

您可以看到它使用extends关键字 for ClassOrInterfaceType, in TypeBound。有关类型参数和通配符的语法,另请参阅第 4.5.1 节。

于 2013-08-02T14:48:56.710 回答
4

是的,你做对了。根据文档,您正在使用上限通配符

要声明上限通配符,请使用通配符 ('?'),后跟 extends 关键字,然后是其上限。请注意,在此上下文中,extends 在一般意义上用于表示“扩展”(如在类中)或“实现”(如在接口中)。

但是在使用参数类型的多个边界时应该小心。在多个边界类型参数中,您必须先指定类名,然后再指定接口。

于 2013-08-02T14:51:50.290 回答
2

是的。这是一个有点旧但仍然有效的解释,在首次引入泛型时写回。

于 2013-08-02T14:45:20.147 回答
1

你写对了。在泛型中,仅允许使用关键字“扩展”,无论是从类扩展还是实现接口。

于 2013-08-02T14:46:25.230 回答