0

我的主要问题围绕何时使用以及与 Class、Abstract、Interface 结合使用时有什么区别:

  1. <E>

  2. <E extends Interface>

  3. <? extends Interface>

下面显示的是带有一些代码签名的详细问题:

此代码使用 Guava 转发装饰器来定义特定的集合。

基础接口:

public interface AnimalSetInterface<E extends AnimalI> extends Set<E>

这有效:

public interface AsiaI<E extends AnimalI> extends AnimalSetInterface<E>

以下给出了错误:

public interface AsiaI<E> extends AnimalSetInterface<E>

边界不匹配:类型 E 不是 AnimalSetInterface 类型的有界参数的有效替代品

我想了解的是,如果我已经在我只想要的基本接口上指定了,<E extends AnimalI>那么为什么我必须再次指定AsiaI

我试图理解泛型,同时尽量减少代码。

此外,如果两个类都有这样的代码,是否有一种组合/最小化(删除/生成样板代码)的好方法:
亚洲:

public Asia(final ImmutableSet<E> animalSet){
    super(animalSet);
}

public static <E extends AnimalI> AsiaI<E> of(final ImmutableSet<E> animalSet){
    return new Asia(animalSet);
}

非洲:

public Africa(final ImmutableSet<E> animalSet){
    super(animalSet);
}

public static <E extends AnimalI> AfricaI<E> of(final ImmutableSet<E> animalSet){
    return new Africa(animalSet);
}
4

1 回答 1

3
 public class Africa<E extends AnimalI> extends AnimalSetAbstract implements AfricaI

 public class Asia<E> extends AnimalSetAbstract implements AsiaI

不同之处在于,在第一种情况下,您的泛型类型必须扩展 AnimalI 在第二种情况下,您的泛型类型可以是任何类。

于 2013-02-28T21:51:13.863 回答