UM2L13——Java泛型

Java泛型

Java中泛型使用的基本规则和C#中一致 (泛型在java底层的实现和C#完全不同) ,泛型可以代表一切类型,主要使用上就是泛型类和泛型方法,主要区别如下:

  1. 泛型方法写法和使用不同
  2. 泛型约束不同
  3. 泛型类型通配符 ?
  4. 一些基础类型必须写他们的包装类名,不能写变量类型(例如int​就需要写Integer​)

泛型基本用法

泛型类的声明和使用如下:

1
2
3
4
5
6
7
public class TestT<T> {
public T testValue;

public T testFun(T t) {
return t;
}
}
1
2
3
4
5
6
7
public class Lesson16 {
public static void main(String[] args) {
TestT<Float> obj = new TestT<>();
obj.testValue = 11f;
System.out.println(obj.testFun(15f));
}
}

输出:

1
15.0

注意!Java中的泛型方法声明与C#不同,Java的泛型方法的<>​是写到访问修饰符后面的!

1
2
3
4
5
public class TestT<T> {
public<K> void testFun2(K k) {
System.out.println(k);
}
}

而调用泛型方法时,Java是不能传入泛型参数的,因此直接传入参数即可

1
2
3
4
5
public class Lesson16 {
public static void main(String[] args) {
obj.testFun2("123");
}
}

输出:

1
123

Java的泛型限制(泛型约束)

泛型限制写法:泛型类名称<T extends 类名或接口名>
Java的泛型限制只能表示泛型类型必须是或者继承某一个类或接口

1
2
3
4
5
6
7
8
9
10
11
public class TestT<T extends Father> {
public T testValue;

public T testFun(T t) {
return t;
}

public<K> void testFun2(K k) {
System.out.println(k);
}
}
1
2
3
4
5
public class Lesson16 {
public static void main(String[] args) {
TestT<Son> obj = new TestT<>();
}
}

泛型中的类型通配符 ?

泛型中的类型通配符写法:泛型类名称<? extends 类名> 变量名 = null;
? extends 类名​,表示类未知,需要使用该泛型对象时,可以单独实例化

1
2
3
4
5
6
7
8
9
10
11
public class Lesson16 {
public static void main(String[] args) {
TestT<?> obj2 = null;
obj2 = new TestT<Son>();
obj2 = new TestT<Father>();

TestT<? extends IFly> obj3 = null;
obj3 = new TestT<Son>();
//obj3 = new TestT<Father>();
}
}