泛型:
1:泛型类引用类型可以是泛型类
class GenericDemo1 {
public static void main(String[] args) {
Data<String> data1 = new Data("zhangsan");
System.out.println(data1.getData());
Student stu = new Student();
stu.setName("lisi");
Data<Student> d1 = new Data<Student>(stu);
System.out.println(d1.getData().getName());
Data<Data<Student>> d2 = new Data<Data<Student>>(d1);
System.out.println(d2.getData().getData().getName());
}
}
// 泛型类
class Data<T> {
private T data;
public Data() {
}
public Data(T data) {
this.data = data;
}
public void setData(T data) {
this.data =data;
}
public T getData(){
return data;
}
}
class Student {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Data2 {
private int data;
public Data2() {
}
public Data2(int data) {
this.data = data;
}
public void setData(int data) {
this.data =data;
}
public int getData(){
return data;
}
}
2:泛型类参数可以有多个
class GenericDemo2 {
public static void main(String[] args) {
Data<String, Integer> data1 = new Data<String, Integer>("zhangsan", 23);
System.out.println(data1.getData1());
System.out.println(data1.getData2());
}
}
// 泛型类
class Data<T1, T2> {
private T1 data1;
private T2 data2;
public Data() {
}
public Data(T1 data1, T2 data2) {
this.data1 = data1;
this.data2 = data2;
}
public T1 getData1() {
return data1;
}
public T2 getData2() {
return data2;
}
}
3:泛型类可以继承泛型类
class GenericDemo3 {
public static void main(String[] args) {
Data1<String, Integer> data1 = new Data1("zhangsan", 23);
System.out.println(data1.getData());
System.out.println(data1.getData2());
}
}
// 泛型类
class Data<T> {
private T data1;
public Data() {
}
public Data(T data1) {
this.data1 = data1;
}
public T getData() {
return data1;
}
}
class Data1<T, T2> extends Data<T> {
private T2 data2;
public Data1() {
}
public Data1(T data1, T2 data2) {
super(data1);
this.data2 = data2;
}
public T2 getData2(){
return data2;
}
}
4:泛型类可以实现泛型接口
class GenericDemo4 {
public static void main(String[] args) {
GenericDemo4 gd = new GenericDemo4();
gd.doMethod();
}
public void doMethod() {
MyData<String, Integer> data = new MyData<String,Integer>();
data.setData2(23);
data.getData("zhgangsan");
System.out.println(data.getData2());
}
}
interface Data<T> {
void getData(T data);
}
class MyData<T, T2> implements Data<T> {
private T2 data2;
public void setData2(T2 data2) {
this.data2 = data2;
}
public T2 getData2() {
return data2;
}
public void getData(T data) {
System.out.println(data);
}
}
上边界限定:
// 泛型的上边界限定,传入的类型需要继承Animal
class Data<T extends Animal> {
public void show(T data) {
System.out.println(data);
}
}
注解:
1: jdk5提供了3个标准注解,也叫标注注解,不影响程序运行
* @Override // 标记这是重写的父类的方法
* @SuppressWarnings("unused") //压制
* @Deprecated //标注此方法已过时
2:自定义注解 通过关键词@interface修饰
创建:
public @interface MyAnnotation {
// 属性的类型和名字
String name();
int age();
Class shuxing();
Color color();
String[] hobby();
String value() default "nihao"; //default "nihao"默认值
}
enum Color {
REG,
GREEN,
BLUE
}
使用方式:
@MyAnnotation(name = "zhangsan", age = 1, shuxing = Student.class, value = "lisi")
@MyAnnotation("zhangsan")//当属性的名字为value()时,可以直接写值
@MyAnnotation(hobby={"football", "basketball"})
@MyAnnotation(color=Color.REG)
3:jdk5提供的4个元注解,修饰注解的注解
元注解可以修饰自己定义的注解
@Retention(RetentionPolicy.SOURCE) //代码期间存在
@Retention(RetentionPolicy.CLASS) //编译时
@Retention(RetentionPolicy.RUNTIME) // 指定注解的存活时长(代码期间存在、编译器、运行时)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) // 指定注解可以修饰的类型
@Documented // 是否在javadoc文档中生成这个注解
@Inherited // 这个注释是否可以被子类继承
使用元注解,修饰了自定义注解只能在方法上使用
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value();
}