package cooom;

/**
 * 自定义泛型类
 * @author 冀帅
 * @date 2020/8/13-22:26
 */
public class Order <T> {
    String orderName;
    int orderId;
    //类的内部结构就可以使用类的泛型
    T orderT;//定义一个不知道什么类型的变量orderT
    public  Order(){};
    public Order(String orderName,int orderId,T orderT){
        this.orderId = orderId;
        this.orderName = orderName;
        this.orderT = orderT;
    }
    public  T getOrderT(){
        return orderT;
    }
    public  void setOrderT(T orderT){
        this.orderT = orderT;
    }

    @Override
    public String toString() {
        return "Order{" +
                "orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                ", orderT=" + orderT +
                '}';
    }
}

package cooom;

/**
 * @author 冀帅
 * @date 2020/8/13-22:51
 */
public class SubOrder extends Order<Integer>{//SubOrder不再是泛型类
}

package cooom;

/**
 * @author 冀帅
 * @date 2020/8/13-22:55
 */
public class SubOrder1<T> extends Order<T>{//SubOrder1<T>仍然为泛型类
}

package cooom;

import com.sun.org.apache.bcel.internal.generic.NEW;
import org.junit.Test;

/** 自定义泛型结构:泛型类丶泛型接口;泛型方法 。
 *
 * 1.关于自定义反省类,泛型接口:
 *
 *
 *
 * @author 冀帅
 * @date 2020/8/13-22:41
 */
public class GenericTest1 {
    @Test
    public  void test1(){
        //如果定义了泛型类,实例化时没有指明类的泛型,则认为此泛型类型为Object类型
        //要求:如果定义了类带泛型的,建议在实例化时要指明泛型的类型
        Order order = new Order();
        order.setOrderT(123);
        order.setOrderT("ABC");
        //建议:实例化时指明类的泛型
        Order<String> order1 = new Order<String>("orderAA",1001,"order:AA");

        order1.setOrderT("AA:hello");

    }
    @Test
    public  void test2(){
        SubOrder sub1 = new SubOrder();//在定义SubOrder类时已经指定过泛型类型,不用在这里在指定了
        //由于子类在继承带泛型的父类时,指明了泛型类型,则实例化子类对象时,不用再指明泛型类型。
        sub1.setOrderT(1122);
        SubOrder1<String> sub2 = new SubOrder1<>();
        sub2.setOrderT("order2...");
    }

}