Java范型是在Java5.0(1.5)版本中提出的,虽然Oracle已经发布了Java 1.9,Java 12的feature也已经在讨论中,但对于很多程序员来讲,对范型的理解和运用并不好,接下来的系列文章带大家一起深入理解Java范型。该系列问题第一篇先请感兴趣的同学看一些范型相关的问题,答案随后给出。
- 定义两个List:
List<Number> numbers = newArrayList<Number>();
List<Integer> integers = new ArrayList<>();
有个方法:
public static void printItem(List<Number>list) {
for (Numbernumber : list) {
System.out.println(number+ "");
}
}
问:printItem(numbers)和printItem(integers)是否有问题?
- 声明一个List<Object> objectList =new ArrayList<>();以下选项哪些是正确的?
1) list.add(2L);
2) list.add(1);
3) list.add(1.0);
4) list.add(null);
5) list.add(new Object());
- 声明一个list,
List<?>list = new ArrayList<>();
以下语句哪些是对的?
1) list.add("a");
2) list.add(1);
3) list.add(new Object())
4) list.add(null);
针对上一问题,如果把list改为
List<Object>list = new ArrayList<>();
4个选项哪些是正确的?声明一个
List<? extends Number>extendsNumberList = new ArrayList<>();
以下选项哪些是正确的?
1) list.add(2L);
2) list.add(1);
3) list.add(null);
- 声明一个
List<? super Number> superNumberList= new ArrayList<>();
以下选项哪些是正确的?
1) list.add(2L);
2) list.add(1);
3) list.add(1.0);
4) list.add(null);
5) list.add(newObject());
通过上述两题,请说出在范型中extends和super关键字的用法,可以通过一个具体的类来说明,例如
List<?extendsNumber>
vsList<? super Number>
。声明一个
List<Integer> intList = newArrayList
,以下代码片段编译、执行都正常吗:
if(intList instanceof List){
System.out.println("List<Integer> is list");
}
- 声明一个
List<Integer> intList = newArrayList
,代码片段编译、执行都正常吗:
if(intListinstanceof List<Integer>){
System.out.println("List<Integer> is list");
}
Java引入范型(Generics)的目的有哪些?
以下代码片段编译、运行是否有问题?
public class GenericTest{
interface Int{
void m1();
}
static class Clz{
void m2(){
System.out.println("in Clz m2");
};
}
static class Gclz<T extends Clz & Int >{
void printClz(T t){
System.out.println("T:" + t.getClass().getName());
System.out.println("T:" + t.getClass().getSimpleName());
t.m1();
t.m2();
}
}
static class AnyClz extends Clz implements Int{
@Override
public void m1() {
System.out.println("in AnyClz m1");
}
}
public static void main(String ... args){
AnyClz anyClz = new AnyClz();
Gclz<AnyClz> gclz = new Gclz<>();
gclz.printClz(anyClz);
}
}
- 如下两个方法签名能否定义在同一个类中,为什么?
public static void printList(List<?> list){...}
public static void printList(List<Object> list){...}
- 定义一个
List<Integer>list = Arrays.asList(5,6)
,调用上题中定义的两个方法打印list元素,是否有问题?