面试题java的泛型_从面试题简单理解Java泛型

下面的2个问题非常经典,个人看完有醍醐灌顶的感觉,大家可以参考:

● 请你讲讲什么是泛型?

考察点:JAVA泛型

参考回答:

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public

class

GenericTest {

public

static

void

main(String[] args) {

/*

List list = new ArrayList();

list.add("qqyumidi");

list.add("corn");

list.add(100);

*/

List list =

new

ArrayList();

list.add(

"qqyumidi"

);

list.add(

"corn"

);

//list.add(100);   // 1  提示编译错误

for

(

int

i =

0

; i < list.size(); i++) {

String name = list.get(i);

// 2

System.out.println(

"name:"

+ name);

}

}

}

采用泛型写法后,在//1处想加入一个Integer类型的对象时会出现编译错误,通过List,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。

● 请解释一下extends 和super 泛型限定符

考察点:JAVA泛型

参考回答:

(1)泛型中上界和下界的定义

上界 extend Fruit>

下界 super Apple>

(2)上界和下界的特点

上界的list只能get,不能add(确切地说不能add出除null之外的对象,包括Object)

下界的list只能add,不能get

(3)示例代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import

java.util.ArrayList;

import

java.util.List;

class

Fruit {}

class

Apple

extends

Fruit {}

class

Jonathan

extends

Apple {}

class

Orange

extends

Fruit {}

public

class

CovariantArrays {

public

static

void

main(String[] args) {

//上界

List

extends

Fruit> flistTop =

new

ArrayList();

flistTop.add(

null

);

//add Fruit对象会报错

//flist.add(new Fruit());

Fruit fruit1 = flistTop.get(

0

);

//下界

List

super

Apple> flistBottem =

new

ArrayList();

flistBottem.add(

new

Apple());

flistBottem.add(

new

Jonathan());

//get Apple对象会报错

//Apple apple = flistBottem.get(0);

}

}

(4)上界 extend Fruit> ,表示所有继承Fruit的子类,但是具体是哪个子类,无法确定,所以调用add的时候,要add什么类型,谁也不知道。但是get的时候,不管是什么子类,不管追溯多少辈,肯定有个父类是Fruit,所以,我都可以用最大的父类Fruit接着,也就是把所有的子类向上转型为Fruit。

下界 super Apple>,表示Apple的所有父类,包括Fruit,一直可以追溯到老祖宗Object 。那么当我add的时候,我不能add Apple的父类,因为不能确定List里面存放的到底是哪个父类。但是我可以add Apple及其子类。因为不管我的子类是什么类型,它都可以向上转型为Apple及其所有的父类甚至转型为Object 。但是当我get的时候,Apple的父类这么多,我用什么接着呢,除了Object,其他的都接不住。

所以,归根结底可以用一句话表示,那就是编译器可以支持向上转型,但不支持向下转型。具体来讲,我可以把Apple对象赋值给Fruit的引用,但是如果把Fruit对象赋值给Apple的引用就必须得用cast。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值