相关疑难解决方法(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

可能重复:
List <Dog>是List <Animal>的子类吗?为什么Java的泛型不是隐式多态的?
Java Generics - 将子类列表分配给超类列表

使用原始类型,您可以轻松地说出类似的内容.

[...] // MyClass is generic with upper bound of Object

MyClass c = new MyClass<Double>();

[...]
Run Code Online (Sandbox Code Playgroud)

但这是不允许的

MyClass<Number> c = new MyClass<Double>() 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样.我的书告诉我为什么第二个不起作用,因为你不能添加一个整数MyClass<Double>.它没有解释的是为什么MyClass<Double>MyClass<Object>(或等效的原始类型形式)的子类,因为double是object的子类.

那么,如果第二种形式不是第一种,为什么第一种允许.请意识到我是新手.

编辑:如果Number是上限,那么在第一个例子中会发生什么呢?

你可以在这里看到类型擦除的影响

class Untitled {
public static void main(String[] args) {

}
public static<T> void c(T t)
{
    t.SubClassMethod();// this won't work because class Object has no such method. But if I change the upperbound to SubClass it will.
            t.toString() // …
Run Code Online (Sandbox Code Playgroud)

java generics

5
推荐指数
1
解决办法
470
查看次数

为什么不能将一个泛型类型实例的引用分配给另一个泛型类型实例?

为什么我收到此警告消息,无法将数字转换为整数.

List<Number> list1 = null;
List<Integer> list2 = null;
list2 = list1;// warning Type mismatch: cannot convert from List<Number> to List<Integer>.
Run Code Online (Sandbox Code Playgroud)

java

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

标签 统计

java ×3

generics ×2

inheritance ×1

polymorphism ×1