文章目录
java泛型
- 泛型的解释:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊类型。
- 参数化类型:
<数据类型>的数据类型只能是引用类型,含义是将类型放在<>当做参数一样传递。
-
有关概念:
- ArrayList<E>中的E称为类型参数变量, ArrayList<Integer>中的Integer称为实际类型参数。
- 整个ArrayList<E>称为泛型类型,整个ArrayList<Integer>称为参数化的类型。 泛型需要的原因:
- Collection, Map集合对元素的类型没有任何限制,本来我们的Collection集合装载的是全部的Dog对象,但是外面把Cat储存到集合中,是没有任何问题的。
- 避免返回对象之后还要强制类型转换。
泛型类
解释:泛型类就是将泛型定义在类上,例如:
class Dog <T>
用户使用该类的时候,才把类型明确下来。
在类上定义的泛型,在类的方法中可以被使用。
使用方法
在用户创建的时候指定类型,该类就会自动转换成用户需要的类型。
Dog<String> myDog = new Dog<>();
泛型方法
仅仅在方法中需要使用泛型,定义泛型方法(先定义后使用)
public <T> void show(T t){
}
泛型类继承
泛型接口
public interface Inter<T>{
public abstract void show(T t);
}
子类明确泛型类的类型参数变量
public interface InterImpl implements Inter<String>
{
@override
public abstract void show(T t){
System.out.print(s);
}
}
子类不明确泛型类的类型参数变量
也要注明该泛型
public class InterImpl<T> implements Inter<T>
{
@override
public abstract void show(T t){
System.out.print(s);
}
}
注: 实现类的要是重写父类的方法,返回值的类型要和父类一样
类上声明的泛型只对非静态成员有效
类型通配符(很厉害的东西)
实例:需要一个方法接收一个集合参数,遍历集合并把集合元素打印出来(用list)
public void test(List<?> list)
{
for(int i = 0; i < list.size(); i++){
sysout(list.get(i));
}
}
注:?可以匹配任意的类型,任意的java类都可以匹配。
泛型中的<Object>没有继承关系
只能调用对象与类型无关的方法,不能调用与类型有关的方法。
设定通配符的上限
List<? extends Number>
表示只能是Number的子类或者自身。
设定通配符的下限
<? super Type>
只能是Type或者Type的父类
泛型擦除
泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,挡住向集合插入非法数据,但是生成的class文件不瘦影响,这个过程称为擦除。
java注解(servlet用到,暂时没接触到)
常见注解就不讲了, 用到了再说
自定义注解
- 标记Annotation
没有任何成员变量的注解称为标记注解,类似@override
public @interface MyAnnotation
{
}
- 元数据Annotation
定义带成员变量的注解叫元数据注解(Annotation)
public @interface MyAnnotation
{
String username();
int age();
}
注意在注解上定义的成员变量只能是String, 数组,class,枚举类,注解
注解使用
通过注解来让方法拥有变量
//注解有什么属性,修饰的时候就要给出对应值
@MyAnnotation(username = "zhong", age = 20)
public void add(String username, int age)
{
}
注解设置默认值
public @interface MyAnnotation
{
String username() default "ehllo";
int age() default 20;
}
注解属性为value
public @interface MyAnnotation
{
String value() default "ehllo";
}
可以不指定value,直接赋值
@MyAnnotation("hello")
注解的基本信息注入方法上
-
反射技术:
- 反射出该类的方法
- 通过方法得到注解上具体的信息
- 将注解上的信息注入到方法上
public static void reflection() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
Class aClass = Annotation.class;
Method method = aClass.getMethod("add", String.class, int.class);
//通过该方法得到注解上的具体信息
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String username = annotation.username();
int age = annotation.age();
//这两句不太懂
Object o = aClass.newInstance();
method.invoke(o, username, age);
}
注:要在注解定义前加
@Retention(RetentionPolicy.RUNTIME)
JDK的元Annotation
@Retention修饰另一个Annotation
-
作用是将制定被修饰的Annotation被保留多次时间,包含一个RetentionPolicy类型value变量,
- SOURCE 编译
- CLASS class文件
-
RUNTIME 运行
因为我们使用反射得到注解上的信息,而反射是运行的时候来获取信息的,所以要修改保留时间。默认是保留到class。
@Target修饰另一个Annotation
target是指定Annotation的用途的。如果是指定ElementType为ANNOTATION_TYPE,则被修饰的annotation只能修饰annotation。
@Documented
被该注解修饰的注解类将被javadoc工具提取为文档
@Inherited
使得被修饰的注解,拥有继承性。被被修饰的类继承,而不是本身的继承。
本文详细介绍了Java中的泛型,包括泛型类、泛型方法、泛型继承、类型通配符和泛型擦除。同时,讲解了Java注解的使用,包括自定义注解、元注解以及注解的反射处理。通过对泛型和注解的深入理解,可以提高代码的安全性和可维护性。
1072





