Kee*_*thi 5 java generics types
我一直在尝试了解Java Generics中的下界通配符的概念和基本原理。我可以理解只读的上限通配符背后的原因,以及在何处以及如何使用它。我仍然无法掌握下限通配符。我有一组遵循以下层次结构的类。(Automobile
是基类。)
Automobile
- Bus
- Minibus
- Doubledecker
- Electricbus
- Car
- Sedan
- Hatchback
- Coupe
- Truck
- Minivan
- Pickuptruck
- Suv
- Fullsuv
- Midsuv
Run Code Online (Sandbox Code Playgroud)
现在,我试图建立一个(灵活的)列表,并向其中添加不同类型的对象。
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
}
}
Run Code Online (Sandbox Code Playgroud)
我能够添加的实例Suv
来List<? super Suv>
。但是,当我尝试将Truck
或的实例添加Automobile
到同一列表时,出现编译错误。是不是List<? super Suv>
足够灵活的采取的任何实例,Suv
其超类或?Truck
并Automobile
在层次结构树中更高。为什么我不能将这些实例添加到列表中?
List<? super Suv>
应理解为“元素类型是 的超类型的列表Suv
”。
现在,让我们看看这两行:
list = new ArrayList<Automobile>();
list.add(a); // where a is an Automobile
Run Code Online (Sandbox Code Playgroud)
第一行没问题,因为ArrayList<Automobile>
确实是“一个元素类型是 的超类型的列表Suv
”。
但让我们读出第二行:将 some 添加Automobile
到元素类型为 的超类型的列表中Suv
。
据编译器从静态类型得知,
list
可以引用 a List<Truck>
(因为Truck
是 的超类型Suv
)并且t
可以指 a Car
(因为 aCar
是Automobile
)因此编译器会抱怨确保您没有将 a 添加Car
到Trucks
.
有用的阅读: