1.如何定义泛型类
//定义泛型类
public class Test<T> {
private T x;
private T y;
public Test(T x, T y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Test{" +
"x=" + x +
", y=" + y +
'}';
}
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
调用泛型类
public class TestMain {
public static void main(String[] args) {
Test<Integer> integerTest = new Test<Integer>(66,88);
Integer x = integerTest.getX();
Integer y = integerTest.getY();
Test<String> stringTest = new Test<>("你好", "泛型");
String x1 = stringTest.getX();
String y1 = stringTest.getY();
}
}
2.泛型通配符
//定义泛型类
public class Test<T> {
private T x;
public void show(){
System.out.println("show打印"+x);
}
public Test() {
}
public Test(T x) {
this.x = x;
}
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
}
public class TestMain {
public static void main(String[] args) {
Test<Integer> integerTest = new Test<>();
integerTest.setX(66);
Test<String> stringTest = new Test<>();
stringTest.setX("今天星期三");
Test<Double> doubleTest = new Test<>();
doubleTest.setX(66.66);
fun(integerTest);
fun(stringTest);
fun(doubleTest);
}
//? 泛型通配符
public static void fun(Test<?> test){
test.show();
}
}
3.泛型的上限和下限
//定义泛型类
public class Test<T> {
private T x;
public void show(){
System.out.println("show打印"+x);
}
public Test() {
}
public Test(T x) {
this.x = x;
}
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
}
public class TestMain {
public static void main(String[] args) {
Test<Integer> integerTest = new Test<>();
Test<String> stringTest = new Test<>();
Test<Number> numberTest = new Test<>();
Test<Object> objectTest = new Test<>();
fun1(integerTest);
fun1(numberTest);
fun2(numberTest);
fun2(objectTest);
}
//设置泛型的上限 不能超过Number类 需要为Number的子类
public static void fun1(Test<? extends Number> test){
test.show();
}
//设置下限 不能小于Number类 需要为Number类或者其父类
public static void fun2(Test<? super Number> test){
test.show();
}
}
4.泛型接口
//定义泛型接口
public interface USB<T> {
public void user(T t);
}
public class Mouse implements USB<String> {
@Override
public void user(String s) {
System.out.println("打印了"+s);
}
}
public class Keyboard<T> implements USB<T>{
@Override
public void user(T t) {
System.out.println("打印了"+t);
}
}
public class TestMain {
public static void main(String[] args) {
Mouse mouse = new Mouse();
mouse.user("hello mouse");
USBMain.Keyboard<String> stringKeyboard = new USBMain.Keyboard<>();
stringKeyboard.use("hello keyboard");
}
}
5.自定义注解
public class USBMain {
public static void main(String[] args) {
Hellow hellow = new Hellow();
hellow.show("你好注解");
}
//自己定义注解 TYPE 类,FIELD 使用在属性,PARAMETER 使用在参数,METHOD使用在方法上 ,//CONSTRUCTOR 使用在构造方法上
@Target(value = {ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)//运行时有效
@Documented //在生成api文档时是否含有该注解
@interface My {
String value() default "";
int age() default 18;//给其默认值18
String[] arr() default {};
}
//使用自定义注解
@My(age = 19)
static class Hellow {
private String a;
public void show(String s){
System.out.println("打印"+s);
}
}
}