简介

java 通配符 是java写库的人必备的技能树

感觉有点模糊

jdk 版本要求较高 否则可能出现变异不通过的情况 最好用最新版本(jdk14) 虽然java 核心编程要求的是jdk1.8 但是我的jdk8 是编译不过去的

code

package com.company;

import com.company.Manager;

public class PairTest3
{
public static void main(String[] args)
{
Manager ceo = new Manager("Gus Greedy", 800000, 2003, 12, 15);
Manager cfo = new Manager("Sid Sneaky", 600000, 2003, 12, 15);
Pair<Manager> buddies = new Pair<Manager>(ceo, cfo);
printBuddies(buddies); ceo.setBonus(1000000);
cfo.setBonus(500000);
Manager[] managers = { ceo, cfo }; Pair<Employee> result = new Pair<Employee>();
minmaxBonus(managers, result);
System.out.println("first: " + result.getFirst().getName()
+ ", second: " + result.getSecond().getName());
maxminBonus(managers, result);
System.out.println("first: " + result.getFirst().getName()
+ ", second: " + result.getSecond().getName());
} public static void printBuddies(Pair<? extends Employee> p)
{
Employee first = p.getFirst();
Employee second = p.getSecond();
System.out.println(first.getName() + " and " + second.getName() + " are buddies.");
} public static void minmaxBonus(Manager[] a, Pair<? super Manager> result)
{
if (a == null || a.length == 0) return;
Manager min = a[0];
Manager max = a[0];
for (int i = 1; i < a.length; i++)
{
if (min.getBonus() > a[i].getBonus()) min = a[i];
if (max.getBonus() < a[i].getBonus()) max = a[i];
}
result.setFirst(min);
result.setSecond(max);
} public static void maxminBonus(Manager[] a, Pair<? super Manager> result)
{
minmaxBonus(a, result);
PairAlg.swapHelper(result); // OK--swapHelper captures wildcard type
}
} class PairAlg
{
public static boolean hasNulls(Pair<?> p)
{
return p.getFirst() == null || p.getSecond() == null;
} public static void swap(Pair<?> p) { swapHelper(p); } public static <T> void swapHelper(Pair<T> p)
{
T t = p.getFirst();
p.setFirst(p.getSecond());
p.setSecond(t);
}
}
package com.company;

public class Manager extends Employee{
private double bonus;
public Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);
bonus = 0;
} public double getSalary() {
double baseSalary = super.getSalary();
return baseSalary + bonus;
} public void setBonus(double bonus) {
this.bonus = bonus;
} public boolean equals(Object otherObject){
if (!super.equals(otherObject)) return false;
Manager other = (Manager) otherObject;
return bonus == other.bonus;
} public int hashCode(){
return super.hashCode() + 17 * new Double(bonus).hashCode();
} public String toString() {
return super.toString() + "[bonus=" + bonus + "]";
} public double getBonus() {
// TODO Auto-generated method stub
return this.bonus;
}
}
package com.company;

public class Pair<T>
{
public Pair() { first = null; second = null; }
public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; }
public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; }
public void setSecond(T newValue) { second = newValue; } private T first;
private T second;
}
package com.company;

import java.time.*;
import java.util.Objects;
public class Employee{
private String name;
private double salary;
private LocalDate hireDay; public Employee(String name, double salary, int year, int month, int day){
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
} public String getName() {
return name;
} public double getSalary() {
return salary;
} public LocalDate getHireDay() {
return hireDay;
} public String getDescription() {
return String.format("an emplyee with a salary of $%.2f", salary);
} public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
} public boolean equals(Object otherObject) {
if (this == otherObject) return true;
if (otherObject == null) return false;
if (getClass() != otherObject.getClass()) return false; Employee other = (Employee) otherObject;
return Objects.equals(name, other.name) && salary == other.salary
&& Objects.equals(hireDay, other.hireDay);
} public int hashCode(){
return Objects.hash(name, salary, hireDay);
} public String toString() {
return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
}
}

Q&A

? super Manager 的作用 <? extends Employee>

带有超类型限定的通配符可以向范型对象写入,带有子类型限定的通配符可以从泛型对象读取。

Tips

初看有点不懂,还是等以后工作的时候一边写代码一边熟悉。

java 通配符的使用的更多相关文章

  1. 对Java通配符的个人理解(以集合为例)

    对Java通配符的个人理解(以集合为例) 前言:最近在学习Java,当学到了泛型的通配符时,不是很理解PECS(Producer Extends Consumer Super)原则,以及<? e ...

  2. [Java基础]Java通配符

    转自:http://peiquan.blog.51cto.com/7518552/1303768 本以为这会是一篇比较基础的博客,可一旦深究的时候,才发现很多有意思的东西,也发现了很多令人迷惑的地方. ...

  3. Java通配符解惑

    T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是List<Anilmal>的子类型,那就需要去寻找替他解决的办法, 是AnimalTrianer ...

  4. Java 通配符匹配查找文件

    比较了一下Java正则表达式与通配符之间的差别,很简单的进行了一下转化就行了.此外要注意String的replace和replaceAll的用法的含义,不要搞错了. 字符串匹配例子 String s  ...

  5. java通配符写法

    有时候我们会遇到这样的需求,需要把一个报文里的某些参数项通过通配符的形式配置成我们需要的结果值插入回报文中. String filetext = "<cn>#用户身份ID(主账号 ...

  6. 大白话说Java泛型(二):深入理解通配符

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(二):深入理解通配符> 上篇文章<大白话说Java泛型(一):入门.原理.使用>,我们讲了泛型的产生缘由以及 ...

  7. Java 泛型在实际开发中的应用

    java泛型是对Java语言的类型系统的一种扩展,泛型的本质就是将所操作的数据类型参数化.下面我会由浅入深地介绍Java的泛型. 一:泛型出现的背景 在java代码里,你会经常发现类似下边的代码: p ...

  8. 大白话说Java泛型:入门、使用、原理

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型:入门.使用.原理> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都 ...

  9. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  10. Java泛型学习笔记 - (七)浅析泛型中通配符的使用

    一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...

随机推荐

  1. fiddler的自动响应器

    1.点击autoresponder,勾选enable rules和unmatched requests passthrough 2.替换步骤 (1)把要替换的会话拉取到空白处,或者选中要替换的内容点击 ...

  2. 【一步步开发AI运动APP】八、自定义姿态动作识别检测——之姿态相似度比较

    之前我们为您分享了[一步步开发AI运动小程序]开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身.线上运动赛事.AI学生体测.美体.康复锻炼等应用场景的AI运动小程序:为了帮助开发者继 ...

  3. 多线程——ThreadPool

    参考:第三节:ThreadPool的线程开启.线程等待.线程池的设置.定时功能 - Yaopengfei - 博客园 (cnblogs.com) C# AppDomain 详解_勇于尝试,却要三思后行 ...

  4. 在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接

    在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接 引言 在容器化环境中,确保不同服务之间的可靠通信是至关重要的.本文将指导你如何使用Podman来配置Dify ...

  5. Sublime Text4 4192 安装和一键激活

    介绍 此教程用于Windows 下Sublime Text4 4192版本的安装和激活. 无需安装其他软件,无需下载替换文件,无需注册机等. 官网: https://www.sublimetext.c ...

  6. 【经验】Ubuntu20.04虚拟机的网络问题|在NAT模式没有网络连接图标,桥接模式正常

    我的版本:Ubuntu20.04.04,iso是清华镜像站的release版本. 问题:NAT模式没有网络连接图标,或者图标闪一下就消失不见,并且无法获取IP地址:但是桥接模式的网络服务却是正常的. ...

  7. Lasso回归及其R语言操作

    Lasso回归形式: 确定lamda使得RSS-lamda*sum(Bi)最小,RSS为普通最小二乘估计的回归平方和. 作用: 确定哪些变量更重要,lamda从0到1过程中,哪些变量的系数最慢趋于0, ...

  8. Nginx No, Traefik Yes

    As we all know, Nginx is a very popular reverse proxy server. It is very stable and has a lot of fea ...

  9. WPF 的Image 控件 设置 Image.Source 的数据源,可能存在跨线程调用的问题。

    相信很多WPF 的开发,应该都很多用到 Image 这个控件来显示图片.这个图片的来源可以来自各种各样的方式获取到. 我们的组内白板.批注的扫码的功能也用到这个去生成二维码,生成后,二维码显示不出来, ...

  10. springBoot 使用jpa数据保存数据报数组越界问题

    在User类中定义gender使用的是一个枚举(Male, Female),但是在实际生成的表中该属性是一个int, 于是在保存数据时出现了 java.lang.ArrayIndexOutOfBoun ...