【发布时间】:2014-11-29 08:14:26
【问题描述】:
我一直在尝试理解 Java 泛型中下界通配符背后的概念和基本原理。我可以理解上限通配符只读的原因以及它可以在何处以及如何使用。我仍然无法掌握下界通配符。我有一组遵循以下层次结构的类。 (Automobile 是基类。)
Automobile
- Bus
- Minibus
- Doubledecker
- Electricbus
- Car
- Sedan
- Hatchback
- Coupe
- Truck
- Minivan
- Pickuptruck
- Suv
- Fullsuv
- Midsuv
现在我正在尝试构建一个(灵活的)列表并向其中添加不同类型的对象。
import java.util.ArrayList;
import java.util.List;
public class Garage {
public static void main(String[] args)
{
List<? super Suv> list = null;
Suv s = new Suv();
Truck t = new Truck();
Automobile a = new Automobile();
list = new ArrayList<Suv>();
list.add(s); // declared as List<? super Suv> but actually List<Suv>. No compilation error
list = new ArrayList<Truck>();
list.add(t); // declared as List<? super Suv> but actually List<Truck>. Compilation error
list = new ArrayList<Automobile>();
list.add(a); // declared as List<? super Suv> but actually List<Automobile>. Compilation error
}
}
我可以将Suv 的实例添加到List<? super Suv>。但是当我尝试将Truck 或Automobile 的实例添加到同一个列表时出现编译错误。 List<? super Suv> 是否不够灵活,无法接受 Suv 或其超类的任何实例? Truck 和 Automobile 在层次结构树中较高。为什么我无法将这些实例添加到列表中?
【问题讨论】: