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

另一个Java通用问题

仉磊
2023-03-14
问题内容

我有以下课程:

interface Able{/* ... */}
class A implements Able{/* ... */}

我有

Map<String,? extends Able> as;
as = new HashMap<String, A>();

为什么以下原因导致错误:

as.put("a", new A());

有任何想法吗?


问题答案:

对Java泛型的引用很好(jdk
site
)。

确实,@ Oli_Charlesworth提供了一个很好的答案,但也许这个答案会更完整。

在中,Collection<? extends Able>您不能插入任何正确的内容。

如果你有

class A implements Able {...}

class B implement Able {...}

然后,Collection<? extends Able>是两者的超类型:

Collection<A>
Collection<B>

因此写一些像这样的声明是合法的

//Code snippet 01
Collection< ? extends Able > list;
Collection<A> listA;
Collection<B> listB;
list = listA;
list = listB;

这确实是通配符表示法Collection<? extends Able>存在的原因。

但是,这里的事情变得越来越有趣:

在中,Collection<A>您只能插入的对象A(包括子类)。相同Collection<B>。在这两种情况下,您都无法添加仅仅是的内容Able。例如

//Code snippet 02
listA.add( new A() );  //valid at compile-time
listA.add( new B() );  //not valid at compile-time
listB.add( new B() );  //valid at compile-time
listB.add( new A() );  //not valid at compile-time

因此,如果将我们看到的内容分组code snippets 01 & 02,您将了解编译器绝对不可能接受如下语句:

Collection< ? extends Able > list;
list.add( new A() );         //not allowed, will work only if list is List<A>
list.add( new B() );         //not allowed, will work only if list is List<B>

因此,是的,super类型`Collection< ? extends Able

不接受添加任何内容。更为通用的类型提供子类型的功能的交集,因此,子类型的功能更少。在这里,我们失去了添加A对象和B对象的能力。这些功能将在层次结构中稍后出现……甚至意味着我们无法在超类中添加任何内容Collection<
? extends Able >`

补充说明:

另外,请注意,Collection<Able>您可以在中添加所需的内容:

Collection< Able > list;
list.add( new A() );         //valid
list.add( new B() );         //valid

但是,Collection<Able>是不是一个超类Collection<A>Collection<B>。就像任何继承关系一样,这意味着子类可以执行其父类可以执行的任何操作,因为继承是专门化的。因此,这将意味着我们可以添加一个对象和B对象既子Collection<A>Collection<B>,这是不是这样的。因为它不是超类,所以您不能拥有:

Collection<Able> list;
Collection<A> listA;
Collection<B> listB;
list = listA;  //not valid because there is no inheritance hierarchy
list = listB;  //not valid because there is no inheritance hierarchy

请注意,继承是一种高尼克关系(泛化/专业化),而集合定义了一条高尼克关系(容器/容器)。正式地将它们结合起来是一件令人头疼的事情,即使它很容易被人类的模糊生物所使用,例如在法国的比喻中:synecdocque。:)



 类似资料:
  • 这是哲学家进餐问题的另一个实现,这是家庭作业问题,我将在这里展示我迄今为止所做的尝试: 大部分的代码是准备好的,除了和方法需要改变,我所做的就是添加这个: 和 我知道这不是线程安全的,这个链接也保证了这一点。真正的神话是老师希望我们使用lock来解决这个问题,我可以在和中锁定/解锁互斥锁,锁定和解锁两个锁(choppestick[philosopherNumber].lock();和筷子[(哲学家

  • 在页面存储Python Flask微服务中,我尝试使用主机名master-db访问MySQL数据库,但该名称无法解析。

  • 我有一个搜索类型的下拉框,可以输入关键字来缩小范围,但如图1所示名称可能会重复,所有我想再将地址加入模糊匹配,例如传:阿三 成都,空格分开。 后端的朋友说不好实现是为什么?在调SQL之前将字符串切割后再调SQL匹配不行吗?

  • 尝试从同一命名空间中的另一个服务连接到一个服务。使用ClusterIP创建服务。创建服务后使用该Ip访问服务。请求有时成功,有时失败,我看到两个pod都启动并运行。以下是服务配置

  • 我用Java重写了我的第一个程序,现在它看起来像这样: 实际上一切都很顺利,除了: > 当我在输入a、B和C的值时输入一个非数字类型时,会显示一个双重警告,然后它就会正常工作。(仅1个警告) 当我回答Y或N时,程序终止,但如果我输入任何其他内容,如“g”、“2”或“w”等,程序会再次询问我(第一次也是两次),然后当我输入Y或N,它工作得很好。 我真的不知道这是怎么回事,因为在编译过程中没有警告或错

  • 问题内容: 您好我是Java的初学者,这是我的问题:我有带有以下变量的第一堂课: 我也有这堂课: 我的问题是:我想将number1和number2变量存储到ArrayList中,然后从类test中访问此ArrayList。我怎样才能做到这一点? 问题答案: 和测试类: