package generic; import java.lang.reflect.Array; import java.util.Arrays; import java.util.function.IntFunction; import java.util.function.Supplier; public class Pair<T> { T first; T second; public Pair() { super(); //8.6.5 // first = new T();//error } public Pair( T first ,T second) { super(); //8.6.5 // first = new T();//error } public static void main(String[] args) { //8.6.5不能实例化类型变量(泛型变量) //原因:泛型擦除会变成Object类型,不会 new Object() //构造函数引用 //Supplier 无参数而且返回是T 的函数式接口 // Pair<String> pair2 = new Pair<T>(); //error Pair<String> pair1 = Pair.makePair(String :: new); Pair<String> pair2 = Pair.makePair(String.class); System.out.println(pair1); //8.6.6 不能构造泛型数组 // Pair<String> pair[] = new Pair<String>[3]; //error // ArrayLy.maxMin( "T","D","H"); //error 报错 [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable; // ArrayLy.maxMin(String[] :: new, "T","D","H"); ArrayLy.maxMinT("T","D","H"); } public static <T> Pair<T> makePair(Supplier<T> conr){ return new Pair<T>(); } public static <T> Pair<T> makePair(Class<T> cls){ try { return new Pair<T>(cls.newInstance(),cls.newInstance()); } catch (Exception e) { e.printStackTrace(); } return null; } //不能构造一个泛型数组 /*public static <T extends Comparable> T[] maxMin(){ // T[] mm = new T[2]; //error }*/ static class ArrayLy<E>{ private E[] element; public E[] getElement() { return element; } public void setElement(E[] element) { this.element = element; } public ArrayLy(){ element = (E[]) new Object[10]; } public static <T extends Comparable<T>> T[] maxMin(T ... ts){ Object [] object = new Object[2]; if (ts == null || ts.length == 0) { return null; } T min = ts[0]; T max = ts[0]; for(T t : ts){ if (min.compareTo(t)>0) { min = t; } if (max.compareTo(t)<0) { max = t; } } object[0] = min; object[1] = max; return (T[]) object; } //修改1 ,构造器表达式 public static <T extends Comparable<T>> T[] maxMin(IntFunction<T[]> conrs , T ... ts){ // Object [] object = new Object[2]; T[] object = conrs.apply(2); if (ts == null || ts.length == 0) { return null; } T min = ts[0]; T max = ts[0]; for(T t : ts){ if (min.compareTo(t)>0) { min = t; } if (max.compareTo(t)<0) { max = t; } } object[0] = min; object[1] = max; return (T[]) object; } //修改2 反射 @SafeVarargs public static <T extends Comparable<T>> T[] maxMinT(T ... ts){ T[] object = (T[]) Array.newInstance(ts.getClass().getComponentType(), 2); if (ts == null || ts.length == 0) { return null; } T min = ts[0]; T max = ts[0]; for(T t : ts){ if (min.compareTo(t)>0) { min = t; } if (max.compareTo(t)<0) { max = t; } } object[0] = min; object[1] = max; return (T[]) object; } } }