1.为什么使用泛型
为了解决数据类型一致性的安全问题,
泛型的格式:
public 类名<T,E...>{ T E 都是泛型标志
}
单个泛型
public class Test1 {
public static void main(String[] args) {
Point<Integer> p1 = new Point<>(15,20);
Point<Double> p2 = new Point<>(19.2,13.5);
Point<String> p3 = new Point<>("东经170°","北纬209°");
//如果没有给泛型设置类型 默认为Object类型
Point p4 = new Point();
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
}
}
class Point<T>{
private T x;
private T y;
public Point() {
}
public Point(T x, T y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
多个泛型
public class Test2{
public static void main(String[] args) {
Point<Integer,String> p1 = new Point<>(15,"北纬289°");
System.out.println(p1);
}
}
/**
* 定义多个个泛型
* @param <T>
*/
class Point<T,F>{
private T x;
private F y;
public Point() {
}
public Point(T x, F y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
通配符
public class Test3 {
public static void main(String[] args) {
Info<Integer> i = new Info<>();
i.setVar(15);
fun(i);
/**
* 泛型的引用类型传递要求类型匹配而且泛型也要匹配 如果让泛型匹配任意类型 可以不写 也可以写通配符 ?
*/
}
public static void fun(Info<?> a) {
a.show();
}
}
class Info<T>{
private T var;
public void setVar(T var) {
this.var = var;
}
public void show(){
System.out.println(var+"==============");
}
}
泛型的上限和下限
public class Test4 {
public static void main(String[] args) {
Info<Integer> i = new Info<>(12);
fun(i);
Info<String> s = new Info<String>("武培磊");
fun1(s);
}
//设置泛型的上限
public static void fun(Info<? extends Number> a){
a.show();
}
public static void fun1(Info<? super String> a){
a.show();
}
}
class Info<T>{
private T var;
public Info(T var) {
this.var = var;
}
public void show(){
System.out.println(var+"=========");
}
}
泛型接口
public class Test5 {
public static void main(String[] args) {
Upan<Integer> upan = new Upan<>();
XinXi xi = new XinXi();
}
}
interface Usb<T>{
public T show();
}
class Upan<T> implements Usb<T>{
@Override
public T show() {
return null;
}
}
// 如果不想让泛型类型延续下去 用一个具体的数据类型实现
class XinXi extends Upan<String>{
}
泛型方法
public class Test6 {
public static void main(String[] args) {
Info i = new Info();
i.show();
}
}
class Info{
public <T> T show(){
return null;
}
}
注解
1.预定义注解 在jdk中带有的注解
package com.wpl.demo7;
@SuppressWarnings(value = "all")//忽略所有的警告
public class Test7 {
public static void main(String[] args) {
int a=19;
}
}
class Info{
private String name;
@Deprecated //表示该方法过时了 如果调用该方法会出现删除线
public void show(){
System.out.println("~~~~~~~~~~");
}
}
@FunctionalInterface //表示该接口有且只有一个接口 又叫函数式接口
interface USB{
int a ();
default void show(){
}
2.自定义注解 自己定义的注解
public class Test8 {
public static void main(String[] args) {
}
}
//自定义注解
@interface wpl {
}
@wpl
class Info{
@wpl //没有任何意义 没有被解析
public void show(){
}
}
3.元注解 注解在注解在的注解
public class Test9 { public static void main(String[] args) { } } //自定义注解 /*@Target(value = ElementType.TYPE) //改注解只能在类上使用 @Target(value = ElementType.METHOD)//该注解只能在方法上使用 @Target(value = ElementType.FIELD) //该注解只能在属性上使用 */ @Target(value = ElementType.TYPE) /*@Retention(value = RetentionPolicy.SOURCE)//表示在源代码的时候生效 @Retention(value = RetentionPolicy.CLASS)//表示在字节码时有效,但是字节码被加载到jvm中就没有了该注解*/ @Retention(value = RetentionPolicy.RUNTIME) //表示在字节码时有效,但是字节码被加载到jvm中还有该注解 @interface wpl{ } @wpl class Info{ }