在Class,Abstract,Interface组合中使用extends

时间:2013-02-28 21:40:39

标签: java generics collections

我的主要问题围绕何时使用以及与Class,Abstract,Interface结合使用时的以下区别:

  1. <E>

  2. <E extends Interface>

  3. <? extends Interface>

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

    此代码使用Guava Forwarding Decorators来定义特定的集合。

    基础界面:

    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

    类型的参数

    我想要了解的是,如果我在Base Interface中指定我只需要<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);
    }
    

1 个答案:

答案 0 :(得分:3)

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

 public class Asia<E> extends AnimalSetAbstract implements AsiaI

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