gpt4 book ai didi

java - 泛型和抽象方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:05 32 4
gpt4 key购买 nike

我在 Java 中遇到了一些我觉得很奇怪的东西,但没能找到太多关于它的信息。考虑以下代码:

public class TestClass {

private static abstract class AbstractClass {
abstract List<? extends Object> getList();
abstract Map<Long, List<? extends Object>> getMap();
}

private static final class ConcreteClass extends AbstractClass {
@Override
List<String> getList() {
return null;
}

@Override
Map<Long, List<String>> getMap() {
return null;
}
}
}

编译器在 getMap() 上显示错误方法:

getMap() in ConcreteClass cannot override getMap() in AbstractClass
return type Map<Long, List<String>> is not compatible with Map<Long, List<? extends Object>>

但是 getList() 不存在相同的错误方法,但我希望两者都有效或都失败。在这两种情况下,覆盖方法都是 delcaring List<String>代替 List<? extends Object> .谁能解释一下?

最佳答案

这是因为存在从List<String>的隐式转换至 List<? extends Object> , 但不是来自 Map<Long, List<String>>Map<Long, List<? extends Object>> .

除非您使用通配符类型,否则所有泛型类型都是不变的。由于“外部”Map 类型的通用类型参数中没有通配符,因此它无法捕获任何不完全匹配的通用类型。

如果您的 map 类型是 Map<Long, ? extends List<? extends Object>>然后它就会像您期望的那样工作。

另一部分,如果答案是子类可以覆盖或实现具有不同返回类型的父类(super class)型方法,但前提是子类型方法的返回类型可以隐式转换为父类(super class)型方法的返回类型。 (在 Java 1.4 及以下版本中,即使这样也行不通:如果类型不完全匹配,则会出现编译时错误。)

关于java - 泛型和抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38211280/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com