我有以下课程:
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。我怎样才能做到这一点? 问题答案: 和测试类: