自定义泛型:extends,super关键字的使用

1.泛型类的使用		public class ResponseResult<T> {}
2.泛型方法的使用	    public static <T extends String> T concat(T... ts) {}
3.泛型接口的使用		public interface StringBufferInterface<T extends String> {}
4.泛型关键字介绍		Fan<?>、 Fan<? extends A>、 Fan<? super A1>、 Fan<Object>

1.泛型类的使用:比较常见的接口响应数据封装 ResponseResult.java

package pers.li.genericity.$1genericclass.practise;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ResponseResult<T> {
    private T data;
    private String msg;
    private int code;
    public ResponseResult(T data, String msg, int code) {
        this.data = data;
        this.msg = msg;
        this.code = code;
    }

    public ResponseResult(T data) {
        this.code = 200;
        this.data = data;
    }
    public ResponseResult() {
        this.code = 200;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public static void main(String[] args) throws JsonProcessingException {
        ResponseResult<String> stringResponseResult = new ResponseResult<>();
        System.err.println(new ObjectMapper().writeValueAsString(stringResponseResult));
    }
}

2.泛型方法的使用:简单示例字符串拼接

package pers.li.genericity.$1genericmethod.practise;
public class dataDeal {

    public static <T extends String> T concat(T... ts) {
        StringBuffer stringBuffer = new StringBuffer();
        for (String s:ts
             ) {
            stringBuffer.append(s);
        }
        return (T) stringBuffer.toString();
    }

    public static void main(String[] args) {
        System.err.println(dataDeal.concat("1","2"," ","3"));
    }
}

3.泛型接口的使用:简单示例字符串拼接

package pers.li.genericity.$1genericinterface.practise;
public interface StringBufferInterface<T extends String> {
    public T concat (T... t2);
}

class TestStringBuffer implements StringBufferInterface<String>{
    @Override
    public String concat(String... t2) {
        StringBuffer stringBuffer = new StringBuffer();
        for (String s:t2
             ) {
            stringBuffer.append(s);
        }
        return stringBuffer.toString();
    }

    public static void main(String[] args) {
        TestStringBuffer test = new TestStringBuffer();
        String add = test.concat("1","2");
        StringBufferInterface<String> test2 =  new TestStringBuffer();
        String add2 = test2.concat("1","2");
        System.err.println(add+"|"+add2);
    }
}

4.泛型关键字对比介绍:

package pers.li.genericity.$2limits.practise;

//定义父类
abstract class A {
    private int s;

    public int getS() {
        return s;
    }

    public void setS(int s) {
        this.s = s;
    }

    public abstract void thisName();
}

//定义子类A1
class A1 extends A {

    @Override
    public void thisName() {
        System.err.println("this is A1");
    }
}
//定义A1的子类A11
class A11 extends A1 {
    @Override
    public void thisName() {
        System.err.println("this is A11");
    }
}
//定义子类A2
class A2 extends A {
    @Override
    public void thisName() {
        System.err.println("this is A2");
    }
}

//定义泛型类
class Fan<T>{
    private T fan1;
    private T fan2;

    public T getFan1() {
        return fan1;
    }

    public void setFan1(T fan1) {
        this.fan1 = fan1;
    }

    public T getFan2() {
        return fan2;
    }

    public void setFan2(T fan2) {
        this.fan2 = fan2;
    }

    public Fan(T fan1, T fan2) {
        this.fan1 = fan1;
        this.fan2 = fan2;
    }
    public Fan() {
        this.fan1 = null;
        this.fan2 = null;
    }
}

public class Test {

    public static void main(String[] args) {
    	//?号表示任意类型,即Object类型,所以取值需要强转才能调用方法,放值(即set方法)由于不确定类型,所以会报错
        Fan<?> fan = new Fan(new A1(),new A2());
        Object fan1 = fan.getFan1();
        A1 a = (A1)fan1;
        a.thisName();
//        fan.setFan1(new A1());
        System.err.println("? super A1只能存放A1及其子类对象并且不能get,因为不知道放进去的对象是哪个+++++++++++++++++++++++++++++===");
        //只能存放A1及其子类对象并且不能get,因为不知道放进去的对象是哪个,可以通过强制转换获取结果
        Fan<? super A1> fan2 = new Fan<A>();
        fan2.setFan1(new A1());
        fan2.setFan2(new A11());
        Object fan11 = fan2.getFan1();
        A1 ss = (A1)fan11;
        ss.thisName();
//        A fan11 = fan2.getFan1();
        System.err.println("? extends A只能取值不能放值,因为T必须是继承于A的子类,放值时无法知道到底是哪个子类+++++++++++++++++++++++++++++===");
        Fan<? extends A> fan3 = new Fan(new A1(),new A2());
        fan3.getFan1().thisName();
        fan3.getFan2().thisName();
       /* fan3.setFan2(new A1());
        fan3.setFan2(new A2());
        fan3.setFan2(new A() {
            @Override
            public void thisName() {

            }
        });*/
        System.err.println("真实泛型========================================");
        Fan<A> fan4 = new Fan(new A1(),new A2());
        fan4.getFan1().thisName();
        fan4.getFan2().thisName();
        fan4.setFan2(new A2());
    }


}