泛型
1:首先了解到的就是java泛型可以用来做元组,就行c++里的pair那样。
public class pair<F,S> { F first , S scond ...};
2:泛型类或接口的继承或者实现,这个简单一点,如果不指定泛型的话,直接被当做object。
类似这样的都可以很快的理解 A <T,K,V> extends B<K,V> ...
3:泛型的方法,泛型方法自己就有泛化能力,在返回值前加<T> or <T extends A>
这个T独立于类的的泛型指定,如果该类是泛型类的话。所以不建议在一一个泛型类中泛型方法和类都用同一个字母使用同样的字母。
对于泛型类里的非泛型方法而言如果是静态的则不能使用泛型类型 如T。
4:java的泛型是擦除实现的第二泛型,所以,在一个泛型类内, K f(K a) V f(V a) 不能实现重载,因为都已经被擦除了。
当然可以指定擦除的边界 类似<T extends Object >。当类型进入或者出去的时候自动实现转型。 可以由反射提供一些解除限制的技巧,如 newstance()...
5:自限定类型 如 class myQueuep<T extends Comparable<T>>,这样的话就可以 声明的T t,t就可以调用compareTo了。
6:潜在类型机制,其使用自限定类型或者用其他的接口继承,就可以使擦除边界改变,如 5。但是反射可以提供更好的解决方法。
如 class<?> spkr=speaker.getClass(); Method mspeak=spkr.getMothod("spack"); mspeak.invoke(speaker);
数组
public static <T> T[] g(Class<T> type,int size) {
return (T[])Array.newInstance(type,size);
}
import java.util.ArrayList;
public class 多维数组 {
public static void main(String[] args) {
//与java的泛型擦除密切相关
//基础类型直接用,对象类型要new空间给它,因为一开始分配的只是引用
ArrayList<ArrayList<ArrayList<Integer>>> ar=new ArrayList<>();
ar.add(new ArrayList<>());
ar.get(0).add(new ArrayList<>());
ar.get(0).get(0).add(233);
System.out.println(ar.get(0).get(0).get(0));
ArrayList<ArrayList<Integer>>[][] ar1=new ArrayList[5][5];
ar1[2][2]=new ArrayList<>();
ar1[2][2].add(new ArrayList<>());
ar1[2][2].get(0).add(666);
System.out.println(ar1[2][2].get(0).get(0));
}
}