【发布时间】:2019-08-28 10:03:21
【问题描述】:
我是一名 Java 开发人员,同时也在学习 C# 和 .Net。最近了解到Java中有上限和下限通配符。
<? extends AbstractClass> // upper bounded wildcard
<? super ConcreteClass> // lower bounded wildcard
我尝试在谷歌上搜索答案,但我只阅读了关于变异性的信息,这让我更加困惑。
在 C# 中可以做这样的事情吗?:
public static void addCat(List<? super Cat> list) {
list.add(new Cat());
}
// ...
interface Pet {}
class Cat implements Pet {}
class Dog implements Pet {}
// ...
public static void main(String[] args) {
List<Pet> pets = new ArrayList<>();
pets.add(new Dog());
addCat(pets);
}
【问题讨论】:
-
在 C# 中我们可以做到。由于
Dog和Cat类实现了相同的接口,并且您正在创建Pet的接口(IPet 是接口的专有名称)列表,它将添加实现相同接口的两个类的实例。 -
您在编写代码时已经知道
super Cat是Pet,不是吗?我看不出写List<super Cat>比写List<Pet>有什么好处 -
@ThomasWeller 抱歉,我在学习示例中忘记了,
Cat实现了两个接口。我想告诉调用者我想要一个可以包含Cat的List,但我不会将列表限制为仅 包含Cat对象。