泛型的主要目的:
    就是用来指定容器要持有什么对象,由编译器来确保类型的正确性。
    类型参数:
    我们可以通过使用类型参数,暂时不指定容器的类型,然后稍后再去决定要去使用什么类型

    1. package com.package15;
    2. public class Holder3<T> {
    3. private T t;
    4. Holder3(T t){
    5. this.t=t;
    6. }
    7. public void setT(T t) {
    8. this.t = t;
    9. }
    10. public T getT() {
    11. return t;
    12. }
    13. public static void main(String[] args) {
    14. Holder3<Automobile> h3 = new Holder3<Automobile>(new Automobile());
    15. Automobile t = h3.getT();//不需要强制类型转换
    16. //h3.setT("aaaaaa");//这个时候制定了类型是Automobile类型
    17. //h3.setT(1);
    18. h3.setT(new Automobile());
    19. }
    20. }

    T就是类型参数,我们看看到我们在创建Holder3的对象的时候指明了容器的类型是Automobile类型。所以此时的set方法中也只能传入Automobile类型的对象;所以17、18行代码会 报错
    元组:通过元组我们可以将一组对象打包放在一个单一对象中去。

    1. package com.package15;
    2. public class TwoTuple<A,B> {
    3. public final A first;
    4. public final B second;
    5. TwoTuple(A a,B b){
    6. first=a;
    7. second=b;
    8. }
    9. @Override
    10. public String toString() {
    11. return "TwoTuple{" +
    12. "first=" + first +
    13. ", second=" + second +
    14. ", str='" + str + '\'' +
    15. '}';
    16. }
    17. public static void main(String[] args) throws Exception{
    18. TwoTuple<String,String> object = new TwoTuple<>("aaaa","aaa");
    19. System.out.println(object);
    20. }
    21. }

    通过泛型和元组可以领其返回一个任意类型的对象

    1. package com.package15;
    2. class Amphibian{}
    3. class Vehicle{}
    4. public class TupleTest {
    5. static TwoTuple<String,Integer> f(){
    6. return new TwoTuple<String,Integer>("hi",47);
    7. }
    8. static TwoTuple<Amphibian,Vehicle> info(){
    9. return new TwoTuple<>(new Amphibian(),new Vehicle());
    10. }
    11. public static void main(String[] args) {
    12. TwoTuple<String, Integer> f = f();
    13. System.out.println(f);
    14. TwoTuple<Amphibian, Vehicle> info = info();
    15. System.out.println(info);
    16. }
    17. }

    结合泛型实现栈式存储机制

    1. package com.package15;
    2. public class LinkedStatck<T> {
    3. private class Node<U> {
    4. U itme;//值域
    5. Node<U> netx;//指针
    6. Node() {
    7. itme = null;
    8. netx = null;
    9. }
    10. Node(U item, Node next) {
    11. this.itme = item;
    12. this.netx = next;
    13. }
    14. boolean end(){//判断是否结束
    15. return itme==null&&netx==null;
    16. }
    17. }
    18. private Node<T> top =new Node<T>();//哨兵机制,初始化一个空结点
    19. public void push(T item){
    20. top=new Node<>(item,top);
    21. /*
    22. * 每次调用top方法的时候都回去新new 一个top对象。
    23. * */
    24. }
    25. public T pop(){
    26. T itme = top.itme;
    27. /*
    28. * 此时的top刚好是最后一次添加的top对象,
    29. * 取一次并把指针指向前一个对象。指导遇到哨兵(空的top)这个时候栈已经为空了
    30. * */
    31. if (!top.end())//没有结尾的话
    32. top=top.netx;
    33. return itme;
    34. }
    35. public static void main(String[] args) {
    36. LinkedStatck<String> lk = new LinkedStatck<>();
    37. String str="Phasers on stun!";
    38. for (String s:str.split(" ")) {
    39. lk.push(s);
    40. }
    41. String srg;
    42. while ((srg=lk.pop())!=null)
    43. System.out.println(srg);
    44. }
    45. }