java_泛型

泛型1
    泛型的概念
    泛型类的声明与使用
    泛型接口的声明与使用
    泛型的好处
        
    
    泛型的概念
        如果没有泛型的话,只能用object来接收所有的参数,这样太混乱,也可能出现类型转换错误。

package java20180201_1;
class Wrapper {
    private Object data;
    int i;

    public Wrapper(Object data) {
        this.data = data;
    }

    public Object getData() {
        return data;
    }

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

public class NoGenericsDemo {

    public static void main(String[] args) {

        Wrapper w1=new Wrapper("stt");
        Wrapper w2=new Wrapper(new Integer(100));
        Wrapper w3=new Wrapper(100);
        
        /**
         * java.lang.String cannot be cast to java.lang.Integer
         * java.lang.Integer cannot be cast to java.lang.String
         * compile-time and run-time
         * 放进去可以,取出来有时也可以,虽然语法上不会有问题,但运行时就会有问题。
         */
//        Object d1=w1.getData();//Object范围太大了,希望再具体一点,那么这个时候这种写法就太麻烦,也会有问题。所以才用泛型。
        String d1=(String) w1.getData();
        Integer d2=(Integer) w1.getData();
//        String d3=(String) w3.getData();
        
    }
}

  泛型类的声明与使用

package java20180201_1;

class WrapperDemo<T> {
    private T data;
    int i;

    public WrapperDemo(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }

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

public class Generics {
/**
 * T是形式类型类型参数,下面的String或Integer是实际类型参数,T不可以是基本类型,可以有多个形参
 * @param args
 */
    public static void main(String[] args) {
        WrapperDemo<String> w1=new WrapperDemo<String>("dfs");
        String d1=w1.getData();
        //写法有好几种
        WrapperDemo<String> w2=new WrapperDemo<String>((new Integer(300)).toString());
        WrapperDemo<Integer> w3=new WrapperDemo<Integer>(new Integer(300));
        WrapperDemo<Integer> w4=new WrapperDemo<>(new Integer(300));
        WrapperDemo<Integer> w5=new WrapperDemo<>(100);

        /*
         * 普通类继承泛型接口
         */
        MyImpl w6=new MyImpl();
        String s=w6.test("df");
        /*
         * 泛型类继承泛型接口
         */
        MyImpl2<String> w7=new MyImpl2<>();
        String s1=w7.test("String");

    }

}

这个类同时也是下面泛型接口的调用类

 

 泛型接口的声明与使用

package java20180201_1;

public interface GenericInterface <T>{
    T test(T t);
}

==============================
普通类的泛型接口
package java20180201_1;

/*
 * 实现时要传递一个具体的类型,也就是下面的String样例。
 */
public class MyImpl implements GenericInterface<String> {

    @Override
    public String test(String t) {
        return null;
    }

}

=================================
泛型类的泛型接口
package java20180201_1;

public class MyImpl2<T> implements GenericInterface<T> {

    @Override
    public T test(T t) {
        return null;
    }

}

 


    泛型的好处
        类型安全
        消除强制类型转换(放进去是object,取出来还是object,还得强制转换)

===============================================

泛型2
    有继承关系的类型参数
    泛型与原生类型的关系
    类型擦除
    堆污染

package java20180202_1;


class Wrapper2<T> {
    private T data;
    public Wrapper2(T data){
        this.data=data;
    }
    public T get(){
        return data;
    }
    
    
}
public class GenericDemo2 {
    //堆污染,可变长参数
    public void test(Wrapper2<String>...ws){
        
    }

    public static void main(String[] args) {
        Wrapper2<String> w1=new Wrapper2<>("abc");
        Wrapper2<Object> w2=new Wrapper2<>(new Integer(100));
        /*
         * 运行时是没有区别的,都是java20180202_1.Wrapper2。T只在编译时有用,在运行时会擦除掉,全部是Object类型的,
         */
        System.out.println(w1.getClass().getName());
        System.out.println(w2.getClass().getName());
        
        Wrapper2<Integer> w4=new Wrapper2<>(200);
        w1=w4;
        Wrapper2 temp=w4;
        w1=temp;
        
        /*
         * 非泛型类是就可以将子类赋值给父类的,这叫做向上转型。下面这个是不兼容的
         */
//        w2=w1;
        /*
         * 原生类型与泛型类型,下面是一种典型的向后兼容的做法,将原生类型与泛型类型相互赋值是可以的,但不推荐。
         */
        Wrapper2 w3=new Wrapper2("cde");//这是raw type,没有泛型的功能
        w2=w3;
        w3=w1;
        
    }
}

 


泛型3
    泛型方法的声明与调用
    泛型构造方法的声明与调用
    方法重写与泛型
    

    
泛型4
    无边界通配符
    上边界通配符
    下边界通配符
   

 

转载于:https://www.cnblogs.com/createyuan/p/8406206.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值