public class Point<T> {
private T x;
private T y;
}
在类上加上<泛型>就可以在调用的时候指定参数x和y的类型
public class PointTest {
public static void main(String[] args) {
Point<String> stringPoint = new Point<>("20","10");//指定泛型为String类型
*System.out.println(stringPoint.getX());//得到字符串类型的“20”
System.out.println(stringPoint.getY());//得到字符串类型的“10”
Point<Integer> integerPoint = new Point<>(10, 20);//指定泛型为Integer类型
System.out.println(integerPoint.getX()+ integerPoint.getY());//得到Integer类型的30
}
可以在测试类里通过对泛型T进行指定类型来得到目标效果
public class PointTest {
public static void main(String[] args) {
Point<String> stringPoint = new Point<>("20","10");
Point<Integer> integerPoint = new Point<>(10, 20);
ceceshi(stringPoint);//输出{x="20,y="10"}
ceceshi(integerPoint);(报错)
}
public static void ceceshi(Point<String> p1){
System.out.println(p1);
}
}
与此同时,我们可以在方法中传入参数的同时指定对应的泛型来对传入参数进行筛选
public static <T> T ceceshi(Point<T> p1){
System.out.println(p1);
T t=p1.getX();
return t;
}
我们也可以通过对方法的参数指定泛型(泛型方法),这样我们就可以在调用该方法的时候对方法的各项参数进行类型的指定
public interface Demo01<T> {}//泛型接口
public class Demo01Impl <T> implements Demo01<T>{}//泛型实现类必须和接口的泛型类型一致
public class Demo01Impl <String> implements Demo01<String>{}//实现类若是普通类则必须指定泛型的类型
泛型接口则是通过对接口名后加<泛型>来规定泛型,泛型接口的泛型实现类必须包含泛型接口的泛型类型,而泛型接口的普通实现类则必须对泛型的类型进行指定
public class PointTest {
public static void main(String[] args) {
Point<String> stringPoint = new Point<>("20","10");
Point<Integer> integerPoint = new Point<>(10, 20);
ceceshi(stringPoint);//输出{x="20",y="10"}
ceceshi(integerPoint);//输出{x=10,y=20}
}
public static void ceceshi(Point<?> p1){
System.out.println(p1);
}
}
也可以通过使用通配符<?>来去除这种限制
public class PointTest {
public static void main(String[] args) {
Point<String> stringPoint = new Point<>("20","10");
Point<Integer> integerPoint = new Point<>(10, 20);
ceceshi(stringPoint);(报错)
ceceshi(integerPoint);//输出{x=10,y=20}
}
public static void ceceshi(Point<? extends Number> p1){
System.out.println(p1);
}
}
或者通过通配符、extends(设定上限)、super(设定下限)来实现更加灵活的限制
----------------------------------------------------------------------
注解则是分为标准注解、自定义注解和元注解
@RestController
@RequestMapping("/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
@Autowired
private OutlibraryService outlibraryService;
@RequestMapping("findAllGoods")
public Result findAllGoods(Integer currentPage, Integer pageSize,@RequestBody GoodsVo goodsVo,HttpSession session){
//获取当前登陆者信息
Staff staff = (Staff) session.getAttribute("staff");
//如果登录者是小张就查询所有商品
if (staff.getStaffid().equals(111)){
goodsVo.setBranchid(goodsVo.getBranchid());
}else {
//如果不是就获取当前登陆者
goodsVo.setBranchid(staff.getBranchid());
}
PageInfo<Map> all = goodsService.findAll(currentPage, pageSize,goodsVo);
return new Result(200,"传输数据成功",all);
}
标准注解则是像@Autowired和@RestController这样spring框架自带的注解,他们根据功能作用不同可以写在类上、方法上或者参数上
public @interface MyZhuJie {
}
而自定义注解可以在类名前加@interface来创建而成,可以自定义想要的规则
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.PARAMETER,ElementType.ANNOTATION_TYPE,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.METHOD})
@Documented
public @interface MyZhuJie {
}
元注解则是注解的注解,用于表示注解所修饰的范围(@Target)、能否被Doc工具所记录(@Documented)、或者标注该注解的保留策略(@Retention)等
@Targe注解的取值是一个ElementType类型的数值。它声明了该注解所修饰的范围
ElementType.TYPE(规定了类或接口的适用范围)
ElementType.FIELD(规定了可适用的成员变量)
ElementType.METHOD(规定了可适用的方法类型)
ElementType.PARAMETER(规定了可适用的参数)
ElementType.CONSTRUCTOR(规定了可适用的构造方法)
ElementType.TYPE_PARAMETER(规定了可适用的参数类型)
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.PARAMETER,ElementType.ANNOTATION_TYPE,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.METHOD})
@Documented
public @interface MyZhuJie {
int value() default 0;
String[] Array() default {};
}
@MyZhuJie(value = 10,Array = {"小明","小王"})
private Integer i1;
值得注意的是,我们可以在自定义注解中加上变量来为注解添加可输入参数并可以在后面加上default来规定默认值
如果没有默认值使用该注解必须输入参数。