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

List <Map <String,String >> vs List <?扩展Map <String,String >>

两者之间有什么区别吗?

List<Map<String, String>>
Run Code Online (Sandbox Code Playgroud)

List<? extends Map<String, String>>
Run Code Online (Sandbox Code Playgroud)

如果没有差异,使用的好处是? extends什么?

java generics polymorphism inheritance

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

在子类java中更改类变量类型

我有一个名为“模块”的课程

public abstract class Module {

    protected Map<String, Port> ports;

    ...

    public Map<String, Port> getPorts() {
        return ports;
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个名为 Design 的类,它是 Module 的子类

public class Design extends Module{
    ...

    //want to do this but doesn't compile
    @override
    public Map<String, Port> getPorts() {
        return (Map<String, TopPort>) ports;  //TopPort is a subclass of Port
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我想要做的只是将 TopPorts 添加到 Design 并在从 getPorts() 函数返回时已经转换类型。

我现在正在做的是在 getPorts 函数在 main 中返回后将 Ports 转换为 TopPorts,但这非常糟糕,在我的代码上构建的人将无法立即理解何时返回 TopPort。

我还尝试创建另一个函数而不是覆盖 getPorts()

    //want to do this as well …
Run Code Online (Sandbox Code Playgroud)

java polymorphism inheritance

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

标签 统计

inheritance ×3

java ×3

polymorphism ×3

generics ×2