中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

java~類(lei)型的逆變和(he)協變

在 Java 中,泛(fan)型的逆變(contravariance)和協變(covariance)是(shi)涉(she)及到泛(fan)型類型轉換時的兩個重(zhong)要概(gai)念。

協變(Covariance)

協變指的是子類型對象可以賦值給父類型引用的情況。在泛型中,協變表示如果 BA 的子類,那么 List<B> 就是 List<A> 的子類。這意味著你可以將 List<B> 賦值給 List<A>,但只能讀取 List<A> 中的(de)元(yuan)素,不能(neng)向其中添(tian)加任何元(yuan)素。

示例代碼:

List<? extends Number> numbers = new ArrayList<Integer>();

逆變(Contravariance)

逆變指的是父類型對象可以賦值給子類型引用的情況。在泛型中,逆變表示如果 BA 的子類,那么 Consumer<A> 就是 Consumer<B> 的子類。這意味著你可以將 Consumer<A> 賦值給 Consumer<B>,并且可以向其中添加 B 類型(xing)的(de)(de)元素(su),但不能讀(du)取其(qi)中(zhong)的(de)(de)元素(su)。

示例代碼:

Consumer<? super Integer> consumer = System.out::println;

mybatis-plus中的協變

 // 子類轉成父類
  QueryWrapper<ReportLoginTypeHour> queryWrapper = new QueryWrapper<>();
  queryWrapper.lambda()
      .ge(ReportLoginType::getWindowStart, startDate.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli())
      .lt(ReportLoginType::getWindowStart, endDate.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli());

    QueryWrapper<ReportLoginType> queryWrapperMinute = new QueryWrapper<>();
    queryWrapperMinute.setEntity(queryWrapper.getEntity()); // 拷貝查詢條件

 // 子類轉成父類
List<ReportLoginType> list;
list = reportLoginTypeHourMapper.selectList(queryWrapper)
      .stream()
      .map(reportLoginTypeHour -> (ReportLoginType) reportLoginTypeHour)
      .collect(Collectors.toList());

不同的Token在校驗時用到了逆變

Token和它的子類之間的關系

  • Token
    • Md5Token
    • IdToken
      • JwtToken

代碼的實現,每種類型在校驗失敗后會有自己的消息提示

    @Test
	public void testSuper() {
		JwtToken jwtToken = new JwtToken();
		jwtToken.setUserId("1");
		jwtToken.setRoles("admin");
		jwtToken.setJti("123");
		jwtToken.verify(i -> i.getUserId().equals("1"), i -> i.getRoles().equals("admin"), i -> i.getJti() != null);

		Md5Token md5Token = new Md5Token();
		md5Token.setJti("abc123");
		md5Token.verify(i -> i.getJti().equals("abc123"));
	}

	abstract class Token {

		private String jti;

		public String getJti() {
			return jti;
		}

		public void setJti(String jti) {
			this.jti = jti;
		}

	}

	class IdToken extends Token {

		private String userId;

		public String getUserId() {
			return userId;
		}

		public void setUserId(String userId) {
			this.userId = userId;
		}

	}

	class JwtToken extends IdToken {

		private String roles;

		public String getRoles() {
			return roles;
		}

		public void setRoles(String roles) {
			this.roles = roles;
		}

		/**
		 * JwtToken類校驗方法 通配符的下限,校驗實體字段的方法,通過傳入實體的Predicate條件,來對當前實體進行校驗
		 * @return
		 */
		public void verify(Predicate<? super JwtToken>... checks) {
			for (Predicate<? super JwtToken> check : checks) {
				if (!check.test(this)) {
					throw new IllegalArgumentException("JWT token check failed for check " + check);
				}
			}
		}

	}

	class Md5Token extends Token {

		public void verify(Predicate<? super Md5Token>... checks) {
			for (Predicate<? super Md5Token> check : checks) {
				if (!check.test(this)) {
					throw new IllegalArgumentException("Md5 token check failed for check " + check);
				}
			}
		}

	}
posted @ 2024-01-11 14:55  張占嶺  閱讀(189)  評論(0)    收藏  舉報