我的主要问题围绕何时使用以及与 Class、Abstract、Interface 结合使用时有什么区别:
<E>
<E extends Interface>
<? 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);
}