相关疑难解决方法(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万
查看次数

调用具有不同T类的print(List <T> a,T b)时发生错误

我正在尝试学习Java Generics,并找到了以下代码.

public static <T> void print(T a, T b){
    System.out.println(a);
    System.out.println(b);
}

public static void main(String[] args){
    print(new ArrayList<String>(), 1);
}
Run Code Online (Sandbox Code Playgroud)

哪个没问题.

但是,当我将print方法更改为以下内容时,它会让我编译错误.

public static <T> void print(List<T> a, T b){
    System.out.println(a);
    System.out.println(b);
}
Run Code Online (Sandbox Code Playgroud)

错误:

GenericTest.java:9: error: method print in class GenericTest cannot be applied to given types;
  print(new ArrayList<String>(), 1);
    ^
  required: List<T>,T
  found: ArrayList<String>,int
  reason: no instance(s) of type variable(s) T exist so that argument type int conforms to formal parameter type T
  where T …
Run Code Online (Sandbox Code Playgroud)

java generics

5
推荐指数
2
解决办法
132
查看次数

标签 统计

generics ×2

java ×2

inheritance ×1

polymorphism ×1