JDK1.5之后引进了三大常用特性:泛型,枚举,注解,下面我们来看看泛型!!!
泛型指的是在类定义的时候并不会设置类中属性或方法中参数的具体类型,而是在类使用时再定义;
泛型可以定义类,方法,接口:
1. 泛型类
**泛型类的基本语法:
class MyClass<T>{
T value;
}
<>中的T被称为类型参数,用于指代任何类型,假如一个类被<T>修饰,那它就称之为泛型类;
**泛型类在使用的时候需表明类型。
如:
MyClass<String> myClass=new MyClass<>();
**泛型类只能接受类,所有的基本数据类型必须使用包装类。
**泛型类可以接受多个类型参数,多个类型参数之间用',’隔开。
&&引用泛型后,如果明确设置了类型,则为设置类型,如果没有设置类型,则默认为Object类;
2. 泛型方法
**泛型方法的基本语法:
class MyClass {
public <T> T fun(T t){
return t;
}
}
**泛型类可以与泛型方法共存。
**泛型方法始终以自己定义的类型为准
在程序类中追加了泛型之后,避免了ClassCastException的问题,但是参数不统一,所以,我们需要用到通配符了!!!
3. 通配符--》?
有一个方法能接受泛型类的对象,此时,它能接受的只是你规定的类型,一旦传参不是此类型,就会报错,例如:
public class Test{
Message<Integer> message=new Message<>();
message.setMessage(55);
fun(message);
public static void fun(Message<String> temp){
System.out.println(temp.getMessage);
}
}
此时就会出问题,两者参数不统一,我们需要可接受所有泛型类型,但又不能被随意修改,这种情况需要使用通配符来处理:
public static void fun(Message<?> temp){
System.out.println(temp.getMessage);
}
此时,通配符可允许接受任意类型,但由于是不确定类型,所以无法修改;
****在此基础上,产生了两个子通配符:? extends 类 和 ? super 类
? extends 类 --->设置泛型上限(只能接受此类及其子类)
? super 类 ----->设置泛型下限(只能接受此类及其父类)
**上限可以用在类声明,不能被修改,下限只能用在方法参数,可以修改内容;
4. 泛型接口
***泛型接口的基本语法:
interface IMessage<T>{
public void print(T t);
}
对于泛型接口的实现子类有两种做法:
(1) 子类在定义时继续使用泛型;
(2) 子类在实现接口的时候明确给出具体类型;
5. 类型檫除
**泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息都会被檫除,此为类型檫除;(通俗来说,泛型类和普通JAVA类在java虚拟机内没什么不一样)
**在泛型类被类型檫除的时候,之前泛型类中的类型参数部分如果没有指定上限,会被译成Object类,如果指定了上限,则类型参数就会被替换成类型上限。