除了在集合中我们可以使用已经定义好的泛型之外,我们自己还可以自定义泛型,如:自定义泛型类、自定义泛型方法。
一、自定义泛型类
具体的定义方法如下:
public
class
GenericBySelf<T> {
private
String
name
;
private
Integer
id
;
private
T
t
;
List<T>
list
=
new
ArrayList<>();
public
void
SetT(T
t
){
this
.
t
=
t
;
}
public
T getT(){
return
t
;
}
}
上面这个类就叫做自定义泛型类了,可以看到在类名的后面加了" <T> ",它就是我们自定义的泛型了,在类中我们可以用将T看作是一个类型,但具体是哪个类型,需要我们在实例化的时候去指明,如果我们定义了自定义泛型类,而在实例化的时候没有去使用,那么T类型就会被默认为Object类了
当然自定义泛型类是可以被继承的,而子类在继承它的时候可以指明泛型也可以不指明,具体语法如下:
//这是不指明泛型,实例化时需要去给去一个确定的类型
class
son<T>
extends
GenericBySelf<T>{
//....
}
//这里指明了泛型的类型,意味着所有从父类继承过来的使用了泛型的地方全部为Integer类型
class
son
extends
GenericBySelf<Integer >{
//....
}
二、自定义泛型方法
具体定义方法如下:
public
class
GenericBySelf<T> {
private
String
name
;
private
Integer
id
;
private
T
t
;
List<T>
list
=
new
ArrayList<>();
public
void
SetT(T
t
){
this
.
t
=
t
;
}
public
T getT(){
return
t
;
}
public
String getName() {
return
name
;
}
public
void
setName(String
name
) {
this
.
name
=
name
;
}
<E> E Get(E
e
)
{
//......
return e;
}
}
自定义泛型方法在类中是可以单独定义的,可以看到自定义泛型方法与自定义泛型类所使用的泛型的字母是不一样的,也就是说类上定义的泛型对自定义泛型方法是没有影响的,当通过对象调用自定义泛型方法的时候,同样要指明数据类型的(必须使用基本数据类型的包装类或者是自己定义的类):
GenericBySelf<Integer>
i
=
new
GenericBySelf<>();
String
a
=
i
.Get(
"MM"
);
以上就是自定义泛型的使用了,还需注意重要的两点:
①在static方法中不能使用泛型 因为static方法是在实例化一个对象之前就已经加载了的,如果使用了泛型,就像先出现的调用了后出现的,是不符合常理的;
②在try....catch中不能使用泛型