3.6. Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
Java 的泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。
List<Integer> list = new ArrayList<>(); list.add(12); //这里直接添加会报错 list.add("a"); Class<? extends List> clazz = list.getClass(); Method add = clazz.getDeclaredMethod("add", Object.class); //但是通过反射添加,是可以的 add.invoke(list, "kl"); System.out.println(list);
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
1.泛型类:
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Generic<T>{ private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; } }
如何实例化泛型类:
Generic<Integer> genericInteger = new Generic<Integer>(123456);
2.泛型接口 :
public interface Generator<T> { public T method(); }
实现泛型接口,不指定类型:
class GeneratorImpl<T> implements Generator<T>{ @Override public T method() { return null; } }
实现泛型接口,指定类型:
class GeneratorImpl<T> implements Generator<String>{ @Override public String method() { return "hello"; } }
3.泛型方法 :
public static < E > void printArray( E[] inputArray ) { for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println(); }
使用:
// 创建不同类型数组: Integer, Double 和 Character Integer[] intArray = { 1, 2, 3 }; String[] stringArray = { "Hello", "World" }; printArray( intArray ); printArray( stringArray );
常用的通配符为: T,E,K,V,?
- ? 表示不确定的 java 类型
- T (type) 表示具体的一个 java 类型
- K V (key value) 分别代表 java 键值中的 Key Value
- E (element) 代表 Element
Math 常用类
表 1 求最大值、最小值和绝对值的方法
方法
说明
static int abs(int a)
返回 a 的绝对值
static long abs(long a)
返回 a 的绝对值
static float abs(float a)
返回 a 的绝对值
static double abs(double a)
返回 a 的绝对值
static int max(int x,int y)
返回 x 和 y 中的最大值
static double max(double x,double y)
返回 x 和 y 中的最大值
static long max(long x,long y)
返回 x 和 y 中的最大值
static float max(float x,float y)
返回 x 和 y 中的最大值
static int min(int x,int y)
返回 x 和 y 中的最小值
static long min(long x,long y)
返回 x 和 y 中的最小值
static double min(double x,double y)
返回 x 和 y 中的最小值
static float min(float x,float y)
返回 x 和 y 中的最小值
表 2 取整方法及其说明
方法
说明
static double ceil(double a)
返回大于或等于 a 的最小整数
static double floor(double a)
返回小于或等于 a 的最大整数
static double rint(double a)
返回最接近 a 的整数值,如果有两个同样接近的整数,则结果取偶数
static int round(float a)
四舍五入
static long round(double a)
四舍五入
表 3 Math 类中包含的三角函数方法及其说明
方法
说明
static double sin(double a)
返回角的三角正弦值,参数以孤度为单位
static double cos(double a)
返回角的三角余弦值,参数以孤度为单位
static double asin(double a)
返回一个值的反正弦值,参数域在 [-1,1],值域在 [-PI/2,PI/2]
static double acos(double a)
返回一个值的反余弦值,参数域在 [-1,1],值域在 [0.0,PI]
static double tan(double a)
返回角的三角正切值,参数以弧度为单位
static double atan(double a)
返回一个值的反正切值,值域在 [-PI/2,PI/2]
static double toDegrees(double angrad)
将用孤度表示的角转换为近似相等的用角度表示的角
static double toRadians(double angdeg)
将用角度表示的角转换为近似相等的用弧度表示的角
表4 指数的运算包括求方根、取对数及其求 n 次方的运算。
方法
说明
static double exp(double a)
返回 e 的 a 次幂
static double pow(double a,double b)
返回以 a 为底数,以 b 为指数的幂值
static double sqrt(double a)
返回 a 的平方根
static double cbrt(double a)
返回 a 的立方根
static double log(double a)
返回 a 的自然对数,即 lna 的值
static double log10(double a)
返回以 10 为底 a 的对数