当前位置: 首页 > 面试题库 >

泛型中的通配符:“?超级T”有效,而“?延伸T”不是吗?

储俊英
2023-03-14
问题内容

我的问题是有关Java 7中的泛型的。假设我们有这样的类层次结构:

interface Animal {}    
class Lion implements Animal {}    
class Butterfly implements Animal {}

就像在Java泛型教程中一样

我们还有一堂课

class Cage<T> {
    private List<T> arr = new ArrayList<>();
    public void add(T t) {
        arr.add(t);
    }
    public T get() {
        return arr.get(0);
    }
}

这是使用该类的代码

public static void main(String[] args) {
        Cage<? extends Animal> cage = new Cage<>();
        Animal a = cage.get(); //OK
        cage.add(new Lion()); //Compile-time error
        cage.add(new Butterfly()); //Compile-time error   
    }

问题1:

我在这里已经阅读了有关这些问题的信息,但仅仅是这样Cage<?>。但我告诉编译器<? extends Animal>这样类型TCage<T>将是任何动物类型的亚型。那么为什么它仍然给出编译时错误?

问题2:

如果我指定Cage<? super Animal> cage = ...而不是Cage<? extends Animal> cage = ...一切正常,那么编译器不会说不好。为什么在这种情况下它可以正常工作而在上面的示例中却失败了?


问题答案:

笼子必须能够容纳 两种 动物。“ super”表示-表示笼子必须能够容纳 所有 类型的动物-也许还有其他一些东西,因为它? super Animal可能是Animal的超类。“扩展”表示它可以容纳 某些 动物-例如,也许只是狮子,例如:

Cage<? extends Animal> cage = new Cage<Lion>();

这是一个有效的声明,但很明显,狮子笼不会容纳蝴蝶,所以

cage.add(new Butterfly());

不会编译。该声明

cage.add(new Lion());

也不会编译,因为这里的Java正在查看笼的声明Cage<? extends Animal>--而不是现在分配给它的对象(Cage<Lion>)。



 类似资料:
  • 我在学院有一些工作,我们必须按照给定的模块实现通用代码。 所以我正在创建一个只接受、、和的类 我看了一些关于泛型的youtube视频,也很理解,但我的代码中有一个问题,我在任何地方都找不到解决方案。 这是我的课: 在getResultAslong方法中,它应该采用长数据类型,但我有一个问题,即不能使用*操作数。问题是什么?

  • 问题内容: 给定以下示例(将与匹配器结合使用): 这不能与以下内容的方法签名一起编译: 编译器错误消息是: 但是,如果我将方法签名更改为: 然后编译工作。 所以三个问题: 为什么当前版本完全不编译?尽管我在这里模糊地理解了协方差问题,但如果需要的话,我当然无法解释。 将方法更改为有什么缺点吗?如果这样做,还有其他情况会中断吗? 在中通用化方法有什么意义吗?该级似乎并不需要它,因为JUnit的调用方

  • 本文向大家介绍Java泛型 T与T的使用方法详解,包括了Java泛型 T与T的使用方法详解的使用技巧和注意事项,需要的朋友参考一下 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。 在集合框架(Collec

  • 目前,我使用这个解决方案,使用,而不是:

  • 问题内容: 我想知道以下两个方法声明之间有什么区别: 有什么可以/可以做的,而不是另一种?我在本网站的其他地方找不到这个问题。 问题答案: 与上下文隔离-没有区别。在和两者上,您只能调用的方法。 但是有上下文-如果您有泛型类: 然后: 与对象相同的代码 两个优点: 无需强制转换(编译器向您隐藏了此内容) 编译有效的时间安全性。如果使用的是版本,则不能确保方法始终返回。如果返回,则在运行时会有一个。

  • 我的问题标题有点模糊,但本质上我想实现以下几点: struct Foo实现行为A和行为B和行为C 结构栏实现行为A Foo和Bar都实现了一些Content特性 从一个