Android开发Android开发经验谈Android开发

Java 集合枚举泛型(二)

2018-06-05  本文已影响68人  天一方蓝

本文出自:http://blog.csdn.net/dt235201314/article/details/70228260

****欢迎Star(updating):https://github.com/JinBoy23520/CoderToDeveloperByTCLer

一丶慨述

本文为上篇文章的补充,一篇文章说清是不可能,上一篇以集合为主,本篇主要说泛型,关于枚举,参考下文

Java 枚举(enum) 详解7种常见的用法

二丶正文

泛型

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)

例: ArrayList<String> al=new ArrayList<String>();

<String> 及泛型,作用:ArrayList al 里只能存入Srting类型

直接上Demo

/**
 * <pre>
 *     author : JinBiao
 *     CSDN : http://my.csdn.net/DT235201314
 *     time   : 2017/04/16
 *     desc   : 泛型演示
 *     总结   ; 1.Class<T>在实例化的时候,T要替换成具体类
 *                Class<?>它是个通配泛型,?可以代表任何类型
 *              2.<? extends T>受限统配,表示T的一个未知子类。
 *                <? super T>下限统配,表示T的一个未知父类。
 *              3.泛型体现java反射,获取类方法 属性信息
 *              4.便于代码的复用,减少代码量
 *     version: 1.0
 * </pre>
 */

public class Generics {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Dog> al = new ArrayList<Dog>();   // al 的类型就与 Dog绑定了
        //创建一只狗
        Dog dog1 = new Dog();
        //放入到集合中
        al.add(dog1);
        // Dog temp=(Dog)al.get(0);
        // Cat temp=(Cat)al.get(0);

        // Dog temp=al.get(0);   //取al里中的第一个元素 不用强制类型转换
        Gen<Bird> gen1 = new Gen<Bird>(new Bird());
        gen1.showTypeName();
        getData(al);
    }
    public static void getData(ArrayList<?> data) {
        System.out.println("data :" + data.get(0));
    }
}

//定义一个个Bird
class Bird {
    public void test1() {
        System.out.println("aa");
    }

    public void count(int a, int b) {
        System.out.println(a + b);
    }
}

//定义一个类
class Gen<T> {
    private T o;

    // 得到T的类型和名称
    public Gen(T a) {
        o = a;
    }

    public void showTypeName() {
        System.out.println("类型是:" + o.getClass().getName());
        //通过反射机制可以得到T类型的很多信息(比如说得到成员函数名)
        Method[] m = o.getClass().getDeclaredMethods();
        //  打印
        for (int i = 0; i < m.length; i++) {
            System.out.println(m[i].getName());
        }
    }

}

class Cat {
    private String color;
    private int age;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Dog {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

    /**
     * 输出
     类型是:javademo.generics.Bird
     count
     test1
     data :javademo.generics.Dog@7d4991ad
    */

拓展学习:

Java中反射机制(Reflection)学习:http://blog.csdn.net/developer_jiangqq/article/details/7342632

http://www.cnblogs.com/lzq198754/p/5780331.html

这里写了个关于集合泛型枚举的小Demo

演示效果:

image

设计思路:猫狗继承动物,ArrayList<? super Animal>存数数据,类属性颜色用枚举l类表示:

CollectionEnumgGnericsActivity.Java

public class CollectionEnumgGnericsActivity extends Activity implements View.OnClickListener {
    private Button button, button1 , button2;
    private TextView textView;
    private ArrayList<? super Animal> arrayList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_collection_enumg_gnerics);
        button= (Button) findViewById(R.id.button);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        textView = (TextView) findViewById(R.id.text);
        arrayList = new ArrayList<>();
        button.setOnClickListener(this);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    public void button(){
        Dog dog = new Dog("多多","2", Color.green.toString());
        arrayList.add(dog);
        setText();
    }

    public void button1(){
        Cat cat = new Cat("喵喵","3", Color.blue.toString());
        arrayList.add(cat);
        setText();
    }

    public void button2(){
        arrayList.clear();
        textView.setText("");
    }

    public void setText(){
        textView.setText("");
        String string = "";
        for(int i=0;i <  arrayList.size();i++){
            Animal animal = (Animal) arrayList.get(i);
            String text = "姓名" + animal.getName() + "   年龄" +  animal.getAge() + "  颜色"  + animal.getColor() + "\n";
            string += text ;
        }
        textView.setText(string);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                button();
                break;
            case R.id.button1:
                button1();
                break;
            case R.id.button2:
                button2();
                break;
        }
    }
}

相关问题:

【Java】泛型中 extends 和 super 的区别?

写在最后微信扫码提问

image
上一篇下一篇

猜你喜欢

热点阅读