泛型类
目的:解决类型转换
概念:类定义时,并不会设置类中的属性或方法中的参数的具体类型,而是在使用时再定义。
泛型的特色声明符号:<> 例子如下:
class MyClass<T>{
T value1; 其中这里的T被称作类型参数。
}
一般在泛型中有一系列的默认:
1、T-一般的任何类
2、E-Element元素或者Exception 异常
3、K-kye
4、V-Value ,与K相互配合使用
泛型类定义了之后的使用例子:
MyClass<String>myClass1 =new MyClass<String>();
要注意,<>中只接受封装类,例如Integer等
同时还可以接受多个泛型 如class MyClaee<T,E>{
T value1;
T value1;
E value2;
}
多个泛型的定义:MyClass<String,Integer>myClass1 =new MyClass<String,Integer>();
然而可以简略成为MyClass<String,Integer>myClass1 =new MyClass<>();
泛型方法
示例 class MyClass{
public <T> void testMethod(T t){
~~~~~
}
方法中的T被称为参数化类型。
声明的类型参数,其实也是可以当做返回值的类型的。例如
public <T> testMethod1(T t){
System.out.println(y);
}
public <T> T testMethod2(T t){
return t;
}
以下是使用方法:
MyClass<String>myClass = new MyClass <>();
myClass.testMethod1("泛型类");------>普通方法
Integer i = testMethod2 (100);----------->泛型方法
System.out.println(i);
注意,泛型方法始终以自己定义的类型参数为准。
泛型接口
示例 interface Imessage<T>{
public void print <T t>;
}
实现该接口有两种方法:1、子类定义时候继续使用泛型。2、在子类实现接口的时候明确给出类型。
1、示例
interface Imessage<T>{
public viod print<T t>;
}
class MessageImpl<T> implements Imessage<T>{
@override
public void print(T t ){
System.out.println(t);
}
}
main方法{
Imessage<String> msg = new MessageImpl();
msg.pring("HELLO");
}
2、示例
interface Imessage<T>{
public viod print<T t>;
}
class MessageImpl<T> implements Imessage<String>{
@override
public void print(String t ){
System.out.println(t);
}
}
main方法{
Imessage<String> msg = new MessageImpl();
msg.pring("HELLOOOO");
}
泛型擦除
泛型信息仅存在于代码编译阶段,在进入JVM之前,与类型相关信息会被擦除。
如果类型擦除的时候没有设置上限类型,则自动转换成Object类型,如果有设置上限的话则转至上限类型。