相关疑难解决方法(0)

List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的?

我对Java泛型如何处理继承/多态性感到困惑.

假设以下层次结构 -

动物(父母)

- (儿童)

所以假设我有一个方法doSomething(List<Animal> animals).根据所有继承和多态的规则,我会假设a List<Dog> a List<Animal>而a List<Cat> a List<Animal>- 所以任何一个都可以传递给这个方法.不是这样.如果我想实现这种行为,我必须明确告诉该方法接受一个Animal的任何子类的列表doSomething(List<? extends Animal> animals).

我知道这是Java的行为.我的问题是为什么?为什么多态通常是隐含的,但是当涉及泛型时必须指定它?

java generics polymorphism inheritance

727
推荐指数
10
解决办法
10万
查看次数

Java Arrays与Generics

假设一个SuperClass America和它的两个SubClasses SouthAmerica和NorthAmerica

情况1

对于数组:

America[] am = new SouthAmerica[10]; //why no compiler error
am[0]= new NorthAmerica();    //ArrayStoreException at RunTime
Run Code Online (Sandbox Code Playgroud)

案例2

在Genrics中:

ArrayList<America> ame = new ArrayList<SouthAmerica>(); //this does not compile
Run Code Online (Sandbox Code Playgroud)

我的问题不是为什么案例2不编译,但我的问题是为什么案例1编译.我的意思是还有什么可以做这个基础数组类型和子数组对象?

java generics reflection collections

3
推荐指数
1
解决办法
207
查看次数

为什么具有超类值的Map无法接受子类对象?

我有两个类:超类Cluster和子类XCluster.XCluster扩展了Cluster.

我有这个方法签名:

public Map<Integer, XCluster> getClusters() {
...
}
Run Code Online (Sandbox Code Playgroud)

我有这个变量:

Map<Integer, Cluster> clusters = getClusters();
Run Code Online (Sandbox Code Playgroud)

我无法编译这个.Eclipse说方法getCluster()不返回这种类型.我需要将类型从XCluster更改为Cluster.

怎么了?

java

0
推荐指数
1
解决办法
1852
查看次数