一、泛型
代表一组类似的操作
尝试创建一个方法可以遍历整数型数组和字符串型数组,而在java中方法所接受的参数是只能被定义为一种类型,因此无法创建一种输出方法能适应输出三种数据类型数组。
所以需要对不同类型的数组来创建不同的方法,这非常的麻烦。而泛型正是用来解决这个问题,泛型可以代表一组类似的操作
以下是泛型的基本使用准则:
- 声明泛型方法需要有一个类型参数声明区域,该区域的内容用尖括号号’<>'括起来,位置在方法返回类型前或是类名后面;
- 每一个类型参数声明部分包含一个或多个类型参数,是用于指定泛型类型名称的标识符;
- 类型参数可以被用来声明返回类型,也可以被用来声明方法接受参数类型;
- 类型参数只能表示引用数据类型;
package s12_26;
import java.util.*;
/**
* generic_para
*/
public class generic_para {
/*尝试创建一个方法能接受并输出多种种数据类型数组,比如一个可以遍历整数型数组和字符串型数组,
而在java中方法所接受的参数是只能被定义为一种类型,因此无法创建一种输出方法能适应输出三种数据类型数组。
所以需要对不同类型的数组来创建不同的方法,这非常的麻烦。
而泛型正是用来解决这个问题,泛型可以代表一组类似的操作
以下是泛型的基本使用方法:
1.声明泛型方法需要有一个类型参数声明区域,位置在方法返回类型前,在'<>'中;
2.每一个类型参数声明部分包含一个或多个类型参数,是用于指定泛型类型名称的标识符;
3.类型参数可以被用来声明返回类型,也可以被用来声明方法接受参数类型;
4.类型参数只能代表引用类型;
*/
public static <E> void printArray(E[] array){
for (E element : array) {
System.out.print(element+" ");
}
System.out.println();
}
public static <T extends Comparable<T>> void maxo(T x, T y, T z) {
//初始化最大值
T max = x;
if (max.compareTo(y)<0) {
max = y;
}
if (max.compareTo(z)<0) {
max = z;
}
System.out.print(max);
System.out.println();
}
public static void getData(List<?> data){
System.out.println(data.get(0));
}
public static void getData2(List<? extends Number> data){
System.out.println(data.get(0));
}
public static void main(String[] args) {
//1.泛型基本使用,定义一个方法来输出遍历并输出三种不同类型数组的所有元素
//初始化三个不同类型的数组
Integer[] intarray = {1,2,3,4,5};
Double[] darray = {1.23, 54.43, 6.32,5.332};
String[] sarray = {"welcome", "to", "java", "world!"};
//调用输出方法
printArray(intarray);
printArray(darray);
printArray(sarray);
//2.有界类型参数:对类型参数类型进行限制,比如限制在Number类
System.out.print("2,4,7 输出结果:");
maxo(2, 4, 7);
System.out.print("2.34, 45.3, 65.4 输出结果:");
maxo(2.34, 45.3, 65.4);
System.out.print("'hello','world', 'welcome' 输出结果:");
maxo("hello", "world", "welcome");
//3.泛型类:泛型类在创建对象的时候需要将泛型参数类型具体化
generic_cla<String> strCla = new generic_cla<String>();
strCla.add("很不开心");
System.out.println("字符创类型:"+strCla.get());
generic_cla<Integer> intCla = new generic_cla<Integer>();
intCla.add(7777);
System.out.println("字符创类型:"+intCla.get());
//4.类型通配符:用?代表所有具体的类型参数,例如List<?>可以接受Numble和String类型的参数
List<Integer> iList = new ArrayList<Integer>();
List<String> sList = new ArrayList<String>();
iList.add(12);
sList.add("字符串变量");
getData(iList);
getData(sList);
//5.类型通配符的上限也可以通过extends implements等关键字来限制
getData2(iList);
// getData2(sList);//由于将泛化类型限制为Number,此处显示错误表明该于泛化类型不适用字符串list。
}
}
二、注解
需要结合注解处理工具、在框架中使用频繁,通过注解处理工具可以在源码层次进行操作,而且可以处理放置了注解的类文件。
目前了解到注解的分类按照运行机制可分为:
源码注解 | 只在源码文件中存在,编译后失效 |
---|---|
编译时注解 | 在源码文件和编译时都存在 |
运行时注解 | 运行时也存在并且能影响程序运行逻辑 |
按照来源分类
jdk自带注解 | 包括三种标准注解和四种元注解 |
---|---|
第三方注解 | 一般来自第三方的框架,比如spring,使用最频繁 |
自定义注解 | 自己根据语法编写的注解 |