V哥:泛型学习笔记

package com.genericity;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class GenericityTest {
    public static void main(String[] args) {
        List persons = new ArrayList();
        persons.add("hhh");
        persons.add("sss");
        persons.add("aaa");
        persons.add(19);
//        persons.forEach(new Consumer() {
//            @Override
//            public void accept(Object person) {
//                System.out.println(person);
//            }
//        });
        persons.forEach(person -> System.out.println(((String) person).length()));
    }
}

package com.genericity;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class GenericityTest {
    public static void main(String[] args) {
        List<String> persons = new ArrayList<String>();
        persons.add("hhh");
        persons.add("sss");
        persons.add("aaa");
     
        persons.forEach(person -> System.out.println(((String) person).length()));
    }
}

 

    Map<String,Integer> persons = new HashMap<String ,Integer>();
        persons.put("ssss",38);
        persons.put("aaaa",32);
        persons.put("vvvv",33);
        persons.put("zzzz",34);

        persons.forEach((key,value) -> System.out.println(key+"="+value));

 

 1、自定义泛型

Iterator对象定义泛型

 Map定义泛型

 我们可以看到,上面自定义泛型的时候,我们就是在类名的后面加上类型的替代符

比如T,K,V。我们在使用的时候直接把这些T,K,V,替换成对应的类型名称就好; 

package com.genericity;

public class MyDefineTest {
    private static class A<T>{
        private T info;

        public T getInfo() {
            return info;
        }

        public A(T info) {
            this.info = info;
        }

    }
    public static void main(String[] args) {
        A<String> a = new A<>("ssd");
        System.out.println(a.getInfo());
        A<Integer> a1 = new A<>(2);
        System.out.println(a1.getInfo());

    }
}

 

 下面代码不可以

    private static class B extends A<T>{
        public B(T info) {
            super(info);
        }
    }

可以用如下方式使用

package com.genericity;

public class MyDefineTest {
    private static class A<T>{
        private T info;

        public T getInfo() {
            return info;
        }

        public A(T info) {
            this.info = info;
        }

    }
    private static class B extends A<String >{
        public B(String info) {
            super(info);
        }
    }
    public static void main(String[] args) {
        B b = new B("sss");
        System.out.println(b.getInfo());

    }
}

但是,有时候,我们定义一个子类的时候,我们还是无法判断泛型的类型:

package com.genericity;

public class MyDefineTest {
    private static class A<T>{
        private T info;

        public T getInfo() {
            return info;
        }

        public A(T info) {
            this.info = info;
        }

    }
    private static class B<T> extends A<T >{
        public B(T info) {
            super(info);
        }
    }
    public static void main(String[] args) {

        B<String> b = new B<>("sss");
        System.out.println(b.getInfo());

    }
}

3、并不存在泛型类

package com.genericity;

public class MyDefineTest {
    private static class A<T>{
        private T info;

        public T getInfo() {
            return info;
        }

        public A(T info) {
            this.info = info;
        }

    }
    private static class B<T> extends A<T >{
        public B(T info) {
            super(info);
        }
    }
    public static void main(String[] args) {
        A<String> a1 = new A<>("sss");
        A<Integer> a2 = new A<>(33);
        System.out.println(a1.getClass());
        System.out.println(a2.getClass());
        System.out.println(a1.getClass().equals(a2.getClass()));

    }
}

运行出来我们发现a1.getClass()和a2.getClass()相等,那证明不存在泛型类

package com.genericity;

import java.util.ArrayList;
import java.util.List;

public class WildcsrdProblemTest {
    private static void test(List<Object> list){
        for (Object o :list){
            System.out.println(o);
        }
    }

    public static void main(String[] args) {
        List<String > persons = new ArrayList<>();
        persons.add("hhh");
        persons.add("zzz");
        persons.add("aaa");
        test(persons);
    }
}

 

 解决方案修改代码

package com.genericity;

import java.util.ArrayList;
import java.util.List;

public class WildcsrdProblemTest {
    private static void test(List<?> list){
        for (Object o :list){
            System.out.println(o);
        }
    }

    public static void main(String[] args) {
        List<String > persons = new ArrayList<>();
        persons.add("hhh");
        persons.add("zzz");
        persons.add("aaa");
        test(persons);
    }
}

上面的List<?>,其中的?表示的就是一个通配符,表示可以匹配任何类型。在使用的时候,通配符里面的元素,我们用object类型

package com.genericity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class WildcardTest {

    private static class Animal{
        public void say(){
            System.out.println("I am animal i will speak");
        }
    }

    private static class Dog extends Animal{
        @Override
        public void say(){
            System.out.println("I am a dog wangwangwang !");
        }
    }

    private static class Cat extends Animal{
        @Override
        public void say(){
            System.out.println("I am a cat maoamoamao !");
        }
    }

    //List<? extends Animal>限制我们的List中的泛型必须是Animal或者是Animal 的子类
    private static void animalSay(List<? extends Animal> animals){
        animals.forEach(animal -> animal.say());
    }


    //如果在Apple<T extends Number>在下面的String类型的泛型使用时就会报错,extends 类 &接口
    private static class Apple<T extends Number & Serializable>{
        private T info;

        public Apple(T info) {
            this.info = info;
        }

        public T getInfo() {
            return info;
        }

        public void setInfo(T info) {
            this.info = info;
        }


    }

    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();
        animals.add(new Dog());
        animals.add(new Cat());
        animalSay(animals);

        List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog());
        animalSay(dogs);

        List<Cat> cats = new ArrayList<>();
        cats.add(new Cat());
        animalSay(cats);
//
//        List<String> persons = new ArrayList<>();
//        persons.add("dadsada");
//        animalSay(persons);

       // Apple<String> apple = new Apple<>("I am an Apple");
        //System.out.println(apple.getInfo());

        Apple<Integer> apple1 = new Apple<>(49);
        System.out.println(apple1.getInfo());

    }


}

package com.genericity;


import java.util.ArrayList;
import java.util.List;

public class MethodTest {
    private static void arrayToList(Object[] objs, List<Object> list){
        for (Object obj : objs) {
            list.add(obj);
        }
    }

    public static void main(String[] args) {
        Object[] strArr = {"aaa","bbb","ccc"};
        List<String> list = new ArrayList<>();
        arrayToList(strArr,list);//报错
    }
}

package com.genericity;


import java.util.ArrayList;
import java.util.List;

public class MethodTest {
    private static <T> void arrayToList(T[] objs, List<T> list){
        for (T obj : objs) {
            list.add(obj);
        }
    }

    public static void main(String[] args) {
        String [] strArr = {"aaa","bbb","ccc"};
        List<String> list = new ArrayList<>();
        arrayToList(strArr,list);
        System.out.println(list);
    }
}

package com.genericity;


import java.util.ArrayList;
import java.util.List;

public class MethodTest {

    private static <T> void test(List<T> list1,List<T> list2){
        System.out.println(list1);
        System.out.println(list2);
    }

    public static void main(String[] args) {


        List<Object> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(1);
        list1.add(1);
        list1.add(1);
        List<String> list2 = new ArrayList<>();
        list2.add("jljj");
        list2.add("jljj");
        list2.add("jljj");
        list2.add("jljj");
        list2.add("jljj");

        test(list1,list2);//类型不一样一个int一个String最后出现错误

    }
}

 还可以两个类型解决问题

 

package com.genericity;

public class GenterTest {
    private static class Foo{
        public <T> Foo(T t){
            System.out.println(t);
        }
    }

    public static void main(String[] args) {
        new Foo("dddd");//String类型数据
        new Foo(233);//Integer类型
        new <String> Foo("ads");//显示了传入的类型
        new <String> Foo(2323);//类型不匹配报错
    }
}

package com.genericity;

public class InferTest {
    public static class A<T>{
        public static <E> A<E> test1(){
            System.out.println("test1");
            return new A<>();
        }
        public static <E> A<E> test2(E e,A<E> a){
            System.out.println("test2");

            return new A<>();
        }
        public T head(){
            System.out.println("test3");

            return null;
        }
    }

    public static void main(String[] args) {

        //下面两行代码相同
        A<String> a1 = A.test1();//自动识别
        A<String> a2 = A.<String>test1();

        //下面两行相同
        A.test2(56,A.test1());
        A.test2(56,A.<Integer>test1());

    }
}

        //下面代码自动类型推断A.test1().head();两次推断最后就不能推断
        String a = A.<String>test1().head();

package com.genericity;

public class ErasureTest {
    private static class A<T extends Number>{
        private T size;

        public T getSize() {
            return size;
        }

        public A(T size) {
            this.size = size;
        }
    }

    public static void main(String[] args) {
        A<Integer> a = new A<>(50);
        int size = a.getSize();
        System.out.println(size);

        A a1 = a;
        int size1 = a1.getSize();
        System.out.println(size1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值