java笔记Java中的泛型和类通配符
Posted 棉花糖灬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java笔记Java中的泛型和类通配符相关的知识,希望对你有一定的参考价值。
泛型
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
E
:Element(在集合中使用,因为集合中存放的是元素)T
:Type(Java 类)K
:Key(键)V
:Value(值)N
:Number(数值类型)?
:表示不确定的java类型
1. 泛型方法
(1) 类型参数声明和类型参数
在public static <T> T 方法名()
中T
为类型参数 ,表示方法的返回值类型,<T>
为类型参数声明 ,表示方法为泛型方法。
public class GenericMethodTest
{
// 泛型方法 printArray
public static < E > void printArray( E[] inputArray )
{
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println( "整型数组元素为:" );
printArray( intArray ); // 传递一个整型数组
System.out.println( "\\n双精度型数组元素为:" );
printArray( doubleArray ); // 传递一个双精度型数组
System.out.println( "\\n字符型数组元素为:" );
printArray( charArray ); // 传递一个字符型数组
}
}
(2) 有界类型参数
有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的,其格式为类型参数名称 extends 类型参数上界
。
public class MaximumTest
{
// 比较三个值并返回最大值
public static <T extends Comparable<T>> T maximum(T x, T y, T z)
{
T max = x; // 假设x是初始最大值
if ( y.compareTo( max ) > 0 ){
max = y; //y 更大
}
if ( z.compareTo( max ) > 0 ){
max = z; // 现在 z 更大
}
return max; // 返回最大对象
}
public static void main( String args[] )
{
System.out.printf( "%d, %d 和 %d 中最大的数为 %d\\n\\n",
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\\n\\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
System.out.printf( "%s, %s 和 %s 中最大的数为 %s\\n","pear",
"apple", "orange", maximum( "pear", "apple", "orange" ) );
}
}
2. 泛型类
泛型类就是在类名后面添加了类型参数声明部分。
public class Test<T> {
private T name;
public T getName(T name){
return name;
}
public static <T> void printA(T a){
System.out.println(a);
}
}
以上代码中getName方法是泛型方法,但并没有<T>
,这是因为对于声明了<T>
的Test类不需要声明泛型方法,对于带了static的方法,它并不属于类的一部分,相当于没有声明<T>
的类,所以需要声明为泛型方法
3. 类型通配符
(1) 类型通配符
?
被称为类型通配符,例如List<?>
在逻辑上是List<String>
、List<Integer>
等所有List<具体类型实参>
的父类。
import java.util.*;
public class GenericTest {
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();
name.add("icon");
age.add(18);
number.add(314);
//getUperNumber(name); // 会报错,因为String不是Number的子类型
getUperNumber(age);
getUperNumber(number);
}
public static void getData(List<?> data) {
System.out.println("data :" + data.get(0));
}
public static void getUperNumber(List<? extends Number> data) {
System.out.println("data :" + data.get(0));
}
}
(2) T
与?
的区别
T
是类的泛型,?
是对象的泛型
4. <? extends T>
和<? super T>
<? extends T>
表示类型的上界,表示参数化类型的可能是T或是T的子类;<? super T>
表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object
以上是关于java笔记Java中的泛型和类通配符的主要内容,如果未能解决你的问题,请参考以下文章