???????????
????Java??????????????????????????????????????????C++?????????????????????Java???????????????????????????飬??????????????????????????????????????????????????????JVM??????????????????????????????????????????Java??????1.5????????????????????μ????????????????????????????????????????????????????????Java???????????????????Щ????????????????
?????????????????????????????????????????????????????????????????
????public class Node<T> {
????private T data;
????private Node<T> next;
????public Node(T data?? Node<T> next) }         this.data = data;
????this.next = next;
????}
????public T getData() { return data; }
????// ...
????}
?????????????????????????????????????????????????δ???????????????
????public class Node {
????private Object data;
????private Node next;
????public Node(Object data?? Node next) {
????this.data = data;
????this.next = next;
????}
????public Object getData() { return data; }
????// ...
????}
????????ζ?????????????Node<String>????Node<Integer>?????????????JVM?????Node<Object>???????????????????????????????????????????????bounds???????????????????????????
????public class Node<T extends Comparable<T>> {
????private T data;
????private Node<T> next;
????public Node(T data?? Node<T> next) {
????this.data = data;
????this.next = next;
????}
????public T getData() { return data; }
????// ...
????}
????????????????T????????滻??Comparable????????????Object???
????public class Node {
????private Comparable data;
????private Node next;
????public Node(Comparable data?? Node next) {
????this.data = data;
????this.next = next;
????}
????public Comparable getData() { return data; }
????// ...
????}
?????????????????????????????????????????????????????Щ???????????????????????????????????????Щ??????Щ??????C++??????п??????????????????Java??????????С???
?????????
??????Java?в???????????????飬?????????????????????????????
????List<Integer>[] arrayOfLists = new List<Integer>[2];  // compile-time error
???????????????????????????????????????????????????????????????????????????????
?????????????????????????????
????Object[] strings = new String[2];
????strings[0] = "hi";   // OK
????strings[1] = 100;    // An ArrayStoreException is thrown.
??????????????δ??????????????????鯔????????????????????????????????????????е?????????????????????????????????????????????????Java??????????????????????????
????Object[] stringLists = new List<String>[];  // compiler error?? but pretend it's allowed
????stringLists[0] = new ArrayList<String>();   // OK
????// An ArrayStoreException should be thrown?? but the runtime can't detect it.
????stringLists[1] = new ArrayList<Integer>();
?????????????????????????????????????????????????????????JVM?????????????new ArrayList<String>()??new ArrayList<Integer>()????????????????????????????????ó????У??????????????
??????????????????????л????????????????????????δ???
????public class ErasedTypeEquivalence {
????public static void main(String[] args) {
????Class c1 = new ArrayList<String>().getClass();
????Class c2 = new ArrayList<Integer>().getClass();
????System.out.println(c1 == c2); // true
????}
????}
?????????
?????????????????????Node??????????????Java????????????????????????????Bridge method??
????public class Node<T> {
????public T data;
????public Node(T data) { this.data = data; }
????public void setData(T data) {
????System.out.println("Node.setData");
????this.data = data;
????}
????}
????public class MyNode extends Node<Integer> {
????public MyNode(Integer data) { super(data); }
????public void setData(Integer data) {
????System.out.println("MyNode.setData");
????super.setData(data);
????}
????}
???????????????????????????????????????????????Node??MyNode?????????????
????public class Node {
????public Object data;
????public Node(Object data) { this.data = data; }
????public void setData(Object data) {
????System.out.println("Node.setData");
????this.data = data;
????}
????}
????public class MyNode extends Node {
????public MyNode(Integer data) { super(data); }
????public void setData(Integer data) {
????System.out.println("MyNode.setData");
????super.setData(data);
????}
????}
??????????????????????????????????????δ?????δ??????е????????ClassCastException???????String????????Integer??
????MyNode mn = new MyNode(5);
????Node n = mn; // A raw type - compiler throws an unchecked warning
????n.setData("Hello"); // Causes a ClassCastException to be thrown.
????// Integer x = mn.data;
??????????????????????????????е???3?е??????????(????????????4??)?????MyNode?в?????setData(String data)???????????????????Node??setData(Object data)???????????????????3?д?????????????String????????????Object?????ClassCastException???????????????
?????????Java????????????????????????????????
????class MyNode extends Node {
????// Bridge method generated by the compiler
????public void setData(Object data) {
????setData((Integer) data);
????}
????public void setData(Integer data) {
????System.out.println("MyNode.setData");
????super.setData(data);
????}
????// ...
????}
??????????????????????????setData((Integer) data);?????String????????Integer???????????2?б????????unchecked warning??????????????????????????????????????????????????????????Node<Integer> n = mn??????????????????????????????????
??????????
?????????????????????Java???????????????????????飬????????????????????????????????????????????????????????????????????????
????public static <E> void append(List<E> list) {
????E elem = new E();  // compile-time error
????list.add(elem);
????}
????????????Щ????????????????????????????????????????????????????????÷????????????
????public static <E> void append(List<E> list?? Class<E> cls) throws Exception {
????E elem = cls.newInstance();   // OK
????list.add(elem);
????}
??????????????????????????
????List<String> ls = new ArrayList<>();
????append(ls?? String.class);
????????????????????????????????Factory??Template??????????????????????????????????Thinking in Java?е?15???й???Creating instance of types(?????664?)?????????????????????
??????????
?????????????????????????instanceof?????????Java??????????????????????????????????????????????????????????????JVM????????????????ArrayList<Integer>??ArrayList<String>??????????
????public static <E> void rtti(List<E> list) {
????if (list instanceof ArrayList<Integer>) {  // compile-time error
????// ...
????}
????}
????=> { ArrayList<Integer>?? ArrayList<String>?? LinkedList<Character>?? ... }
?????????????????????????????????????bounds????????????
????public static void rtti(List<?> list) {
????if (list instanceof ArrayList<?>) {  // OK; instanceof requires a reifiable type
????// ...
????}
????}