泛型引入背景
当我们调用一个方法的时候,有时候要传参数给方法,但是在调用方法之前我们需要对方法的接受参数类型进行确定,这在设计系统时是有局限性的。试想方法在被调用的时候根据传入的参数类型来确定接受类型,这将大大的提高代码的扩展性,因此有必要了解一下泛型的相关概念。
泛型基本概念
//泛型机制:JDK1.5之后引入的一个概念
//把类型明确工作,推迟到创建对象,或调用方法时,才去明确的一种机制。
//泛型的语法:<数据类型,数据类型>
//泛型可以加在 接口上,类型,方法上
//泛型的好处:1.避免了向下转型,2.将问题提前到了编译期
//泛型的特点:泛型只在编译期有效,在运行期就擦除了。
//泛型可以限定,我这个集合中存储什么样的引用数据类型
//JDK1.7之前 泛型前面后面都得写上,JDK1.7可以省略右半边不写
泛型避免向下转型实例
ArrayList list2
= new ArrayList();
list2
.add("aaaaa");
list2
.add("bbbb");
list2
.add("ccc");
list2
.add("ddd");
Object obj
= list2
.get(0);
String string
= (String
) obj
;
int length
= string
.length();
ArrayList
<String> list3
= new ArrayList();
list3
.add("aaaaa");
list3
.add("bbbb");
list3
.add("ccc");
list3
.add("ddd");
String s
= list3
.get(0);
System
.out
.println(s
);
把泛型加在类上
public class MyClass<T> {
T t
;
public T
getT() {
return t
;
}
public void setT(T t
) {
this.t
= t
;
}
}
泛型加在接口上
public interface MyInterface<T,U,R> {
public R
show(T t
,U u
);
}
MyDemo2
<Integer, String, String> integerStringStringMyDemo2
= new MyDemo2<>();
Collection
<Integer> collection
=new ArrayList<Integer>();
new MyInterface<String,String,String>(){
@Override
public String
show(String s
, String s2
) {
return null
;
}
};
public class MyDemo implements MyInterface<String,Integer,Integer>{
@Override
public Integer
show(String s
, Integer integer
) {
return null
;
}
}
泛型通配符
A:泛型通配符<?>: 任意类型,如果没有明确,那么就是Object以及任意的Java类了 B:? extends E: 向下限定,E及其子类 C:? super E: 向上限定,E及其父类
public class MyTest {
public static void main(String
[] args
) {
ArrayList
<?> objects
= new ArrayList<Dog>();
ArrayList
<? super Cat
> objects2
= new ArrayList<Cat>();
ArrayList
<? extends Animal> objects3
= new ArrayList<Cat>();
ArrayList
<Integer> integers
= new ArrayList<>();
integers
.add(100);
ArrayList
<Integer> integers2
= new ArrayList<>();
integers2
.add(100);
integers
.addAll(integers2
);
}
}
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}