Java面向对象(四)
Java面向对象(四)
1.1泛型(Generic Programming)
会有很多逻辑定义一致的程序,差别是他们的类型不一样。为了方便这样的程序能够重用所以引入泛型。
/**存储两个任意类型的变量*/
public class Pair<T> {
private T first;
private T second;
public Pair(){
first = null;
second = null;
}
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public void setFirst(T first) {
this.first = first;
}
public T getSecond() {
return second;
}
public void setSecond(T second) {
this.second = second;
}
}
public class PairTest {
public static void main(String[] args) {
String[] words = {"apple","ice-cream","water","tea"};
Pair<String> myPair = FindByPair.maxMin(words);
System.out.println(myPair.getFirst());
System.out.println(myPair.getSecond());
}
}
class FindByPair{
public static Pair<String> maxMin(String[] val) {
String min = val[0];
String max = val[0];
for (int i = 0; i < val.length ; i++) {
if (min.compareTo(val[i]) > 0){
min = val[i];
}
if (max.compareTo(val[i]) < 0){
max = val[i];
}
}
//编译器会进行类型推断---泛型擦除
return new Pair<>(min, max);
}
}
import java.io.Serializable;
import java.time.LocalDate;
public class PairTest2 {
public static void main(String[] args) {
LocalDate[] birthdays ={
LocalDate.of(1999,12,12),
LocalDate.of(1996,12,3),
LocalDate.of(1896,1,1),
LocalDate.of(2020,5,30),
};
Pair<LocalDate> localDatePair = FindByPair2.maxMin(birthdays);
System.out.println(localDatePair.getFirst());
System.out.println(localDatePair.getSecond());
}
}
class FindByPair2{
//为类型变量T做限定,说明类型T实现了Comparable接口
//T绑定的类型是某某接口的子类型,用&分隔多个父类型
//public static <T extends Comparable & Serializable> T min(T[] a){
// if (a == null || a.length == 0){
// return null;
// }
// T min = a[0];
// for (int i = 1; i < a.length; i++) {
// if (min.compareTo(a[i]) > 0){
// min = a[i];
// }
// }
// return min;
//}
public static<T extends Comparable> Pair<T> maxMin(T[] val) {
if (val == null || val.length == 0){
return null;
}
T min = val[0];
T max = val[0];
for (int i = 0; i < val.length ; i++) {
if (min.compareTo(val[i]) > 0){
min = val[i];
}
if (max.compareTo(val[i]) < 0){
max = val[i];
}
}
return new Pair<>(min, max);
}
}

import java.time.LocalDate;
public class Employee {
private String name;
private double salary;
private LocalDate hireDate;
public Employee(String name, double salary, int year, int month, int day) {
this.name = name;
this.salary = salary;
this.hireDate = LocalDate.of(year, month, day);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public LocalDate getHireDate() {
return hireDate;
}
public void setHireDate(LocalDate hireDate) {
this.hireDate = hireDate;
}
public void raiseSalary(double byPercent) {
double raise = this.salary * byPercent / 100;
this.salary += raise;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", salary=" + salary +
", hireDate=" + hireDate +
'}';
}
}
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);
this.bonus = 0;
}
@Override
public double getSalary() {
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
public double getBonus() {
return bonus;
}
@Override
public String toString() {
return "Manager{" + super.toString() +
"bonus=" + bonus +
'}';
}
}
import com.oop.generic.Pair;
public class PairTest3 {
public static void main(String[] args) {
Manager ceo = new Manager("Tom",800000,1999,10,1);
Manager cfo = new Manager("Jerry",600000,2000,9,23);
Pair<Manager> buddies = new Pair<>(ceo,cfo);
printBuddies(buddies);
ceo.setBonus(1000000);
cfo.setBonus(500000);
Manager[] managers = {ceo,cfo};
Pair<Employee> res = new Pair<>();
minMaxBonus(managers,res);
System.out.println("First " + res.getFirst().getName()
+ " Second " + res.getSecond().getName());
maxMinBonus(managers,res);
System.out.println("First " + res.getFirst().getName()
+ " Second " + res.getSecond().getName());
}
private static void maxMinBonus(Manager[] managers, Pair<? super Manager> res) {
minMaxBonus(managers,res);
FindByPair3.swapHelp(res);
}
private static void minMaxBonus(Manager[] managers, Pair<? super Manager> res) {
if (managers.length == 0){
return;
}
Manager min = managers[0];
Manager max = managers[0];
for (int i = 0; i < managers.length ; i++) {
if (min.getBonus() > managers[i].getBonus()){
min = managers[i];
}
if (max.getBonus() < managers[i].getBonus()){
max = managers[i];
}
res.setFirst(min);
res.setSecond(max);
}
}
private static void printBuddies(Pair<? extends Employee> buddies) {
Employee first = buddies.getFirst();
Employee second = buddies.getSecond();
System.out.println(first.getName() + " and " + second.getName() + " are buddies");
}
}
class FindByPair3{
public static boolean hasNull(Pair<?> p){
return p.getFirst() == null || p.getSecond() == null;
}
public static void swap(Pair<?> p){
swapHelp(p);
}
public static<T> void swapHelp(Pair<T> p) {
T t = p.getFirst();
p.setFirst(p.getSecond());
p.setSecond(t);
}
}

浙公网安备 33010602011771号