JAVA泛型笔试面试总结

用途

数据结构类型的参数化

产生根源

例如在使用集合框架的时候,Vector里可以添加各种类型,
v.add(new Person("tom",20))
Person p = (Person)v.elementAt(0)
如此使用,到处都需要强制转换。如果出现异常只能在运行时才会抛出。

集合中的泛型

例如Vector v = new Vector(); 
这里的是实际类型参数,限定了v中添加的都是String.

泛型类

例如:
Person{
private T secret;
}
可以衍生出不同的类型。例如
Person o = Person();
Person s = Person();
但他们之间并不存在继承关系。
MAP中常用K V。LIST中用E 代表元素。泛型类中用T

泛型方法

例如为了限定某个方法的两个参数类型一致,可以用:
public T evaluate(T a,T b)
也可以将T定义在泛型类中。

通配符

例如现在写一个方法,来遍历一些不同类型的泛型实例,
public overview(Vector v)
如果将实际类型参数加入,则不能通用。
public overview(Vector v)
去掉实际类型参数,是一种方法。这种情况,在方法体里加入 
v.add(new String("aaa"))
v.add(new Integer(5))
都不会出错,可能在运行时会产生错误,这就破坏了类型安全性限制,使泛型的限制

并没有在编译时发现错误。


引入通配符,public overview(Vector v)
与public overview(Vector v)有什么区别呢?
主要是引入通配符后,Vector类型的变量在调用的时候是受到限制的,凡是必须

知道具体类型参数才能进行的操作会被禁止。
例如
Vector vs = new Vector();
vs.add("TOM");
Vector v = vs;
v.add("BILL");//非法操作
Object o = v.elementAt(0)//合法

受限类型

例如:Person
限制更严格一点,要求泛型必须继承Number

同样通配符也可以用于

限制

基本类型不能用于泛型
例如 List a 这种,是会报错的,Syntax error on token "int", Dimensions expected after this token

习题

1.
QUESTION NO: 70
Given:
11. // insert code here
12. private N min, max;
13. public N getMin() { return min; }
14. public N getMax() { return max; }
15. public void add(N added) {
16. if (min == null || added.doubleValue() < min.doubleValue())
17. min = added;
18. if (max == null || added.doubleValue() > max.doubleValue())
19. max = added;
20. }
21. }
Which two, inserted at line 11, will allow the code to compile? (Choose two.)
A. public class MinMax {
B. public class MinMax {
C. public class MinMax {
D. public class MinMax {
E. public class MinMax {
F. public class MinMax {
解答,看A,B,E显然不对,因为都用了?,代码里的N就没有来源了
C,如果受限类型extends Object,那就没有doubleValue()方法。
答案是 D F
2.

QUESTION NO: 71

Given: 3. import java.util.*; 4. public class G1 { 5. public void takeList(List list) { 6. // insert code here 7. } 8. } Which three code fragments, inserted independently at line 6, will compile? (Choose three.) A. list.add("foo"); B. Object o = list; C. String s = list.get(0); D. list = new ArrayList(); E. list = new ArrayList(); 用通配符后,那些必须知道类型才能进行的操作就被禁止了,比如add,因此A不对
答案是 BCD

你可能感兴趣的:(JAVA泛型笔试面试总结)