泛型

作者: 嘉美伯爵 | 来源:发表于2017-04-28 17:36 被阅读8次
命名规则

问题引入

package practice;
class Point{
    private Object x;
    private Object y;
    public void setX(Object x) {
        this.x = x;
    }
    public Object getX() {
        return x;
    }
    public void setY(Object y) {
        this.y = y;
    }
    public Object getY() {
        return y;
    }
}
public class fanxing {
    public static void main(String []args){
        Point p = new Point();
        p.setX(10);
        p.setY(20);
        int x = (Integer)p.getX();   
        int y = (Integer)p.getY();
        System.out.println("X的坐标:"+x+";"+"Y的坐标:"+y);
    }
}
---------------------------------
package practice;
class Point{
    private Object x;
    private Object y;
    public void setX(Object x) {
        this.x = x;
    }
    public Object getX() {
        return x;
    }
    public void setY(Object y) {
        this.y = y;
    }
    public Object getY() {
        return y;
    }
}
public class fanxing {
    public static void main(String []args){
        Point p = new Point();
        p.setX(10);
        p.setY("20");  //如果不用泛型,两个互不相干的类会出现
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    at practice.fanxing.main(fanxing.java:24)的错误
        int x = (Integer)p.getX();   
        int y = (Integer)p.getY();
        System.out.println("X的坐标:"+x+";"+"Y的坐标:"+y);
    }
}

泛型引入

package practice;
class Point<T>{
    private T x;
    private T y;
    public void setX(T x) {
        this.x = x;
    }
    public T getX() {
        return x;
    }
    public void setY(T y) {
        this.y = y;
    }
    public T getY() {
        return y;
    }
}
public class fanxing {
    public static void main(String []args){
        Point<String> p = new Point<String>();  //<String>只能是引用数据类型,不能是基本数据类型
        p.setX("10");
        p.setY("20");
        String x = p.getX();
        String y = p.getY();
        System.out.println("X的坐标:"+x+";"+"Y的坐标:"+y);
    }
}

如果使用泛型类或接口的时候,用Object

package practice;
class Point<T>{
    private T x;
    private T y;
    public void setX(T x) {
        this.x = x;
    }
    public T getX() {
        return x;
    }
    public void setY(T y) {
        this.y = y;
    }
    public T getY() {
        return y;
    }
}
public class fanxing {
    public static void main(String []args){
        Point p = new Point();   //统一Object
        p.setX("10");
        p.setY("20");
        String x = (String)p.getX();   //需转型
        String y = (String)p.getY();    //需转型
        System.out.println("X的坐标:"+x+";"+"Y的坐标:"+y);
    }
}

通配符

package practice;
class Point<T>{
    private T x;
    public void setX(T x) {
        this.x = x;
    }
    public T getX() {
        return x;
    }
}
public class fanxing {
    public static void main(String []args){
        Point<String> p = new Point<String>();
        p.setX("Hello World!!!");
        fun(p);
    }
    public static void fun(Point<String> m){    //Point<String> m 中的Ponit需要与类名一致
        System.out.println(m.getX());
    }
}

不设置方法类型

package practice;
class Point<T>{
    private T x;
    public void setX(T x) {
        this.x = x;
    }
    public T getX() {
        return x;
    }
}
public class fanxing {
    public static void main(String []args){
        Point<Integer> p = new Point<Integer>();
        p.setX(30);
        fun(p);
    }
    public static void fun(Point m){  //去掉<Integer>,解决不同参数类型的影响
        System.out.println(m.getX());
    }
}

泛型接口

定义接口泛型

package cn.fovegage.prac;
interface IMessage<T>{
    public void print(T t);
}
public class FanXing {
    public static void mian(String []args){
        
    }
}

在子类继续设置泛型

package cn.fovegage.prac;

interface IMessage<T>{
    public void print(T t);
}
class MessageImpl<T> implements IMessage<T>{
    @Override
    public void print(T t) {
        // TODO Auto-generated method stub
        System.out.println(t);
    }
}
public class FanXing {
    public static void main(String []args){
        IMessage<String> msg = new MessageImpl<String>(); 
        msg.print("Hello World!!!");
    }
}

在子类不设置泛型。而为父接口明确的定义一个泛型类型

package cn.fovegage.prac;

interface IMessage<T>{
    public void print(T t);
}
class MessageImpl implements IMessage<String>{
    @Override
    public void print(String t) {
        // TODO Auto-generated method stub
        System.out.println(t);
    }
}
public class FanXing {
    public static void main(String []args){
        IMessage<String> msg = new MessageImpl(); 
        msg.print("Hello World!!!");
    }
}

泛型方法

package cn.fovegage.prac;
public class FanXing {
    public static void main(String []args){
    String str = fun("Hello World!!!");
    System.out.println(str.length());
    }
    public static <T> T fun(T t){
        return t;
    }
}

相关文章

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • 【泛型】通配符与嵌套

    上一篇 【泛型】泛型的作用与定义 1 泛型分类 泛型可以分成泛型类、泛型方法和泛型接口 1.1 泛型类 一个泛型类...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • 探秘 Java 中的泛型(Generic)

    本文包括:JDK5之前集合对象使用问题泛型的出现泛型应用泛型典型应用自定义泛型——泛型方法自定义泛型——泛型类泛型...

  • Web笔记-基础加强

    泛型高级应用 自定义泛型方法 自定义泛型类 泛型通配符? 泛型的上下限 泛型的定义者和泛型的使用者 泛型的定义者:...

  • 重走安卓进阶路——泛型

    ps.原来的标题 为什么我们需要泛型? 泛型类、泛型接口和泛型方法(泛型类和泛型接口的定义与泛型方法辨析); 如何...

  • Kotlin泛型的高级特性(六)

    泛型的高级特性1、泛型实化2、泛型协变3、泛型逆变 泛型实化 在Java中(JDK1.5之后),泛型功能是通过泛型...

  • Java 19-5.1泛型

    泛型类定义泛型类可以规定传入对象 泛型类 和泛型方法 泛型接口 如果实现类也无法确定泛型 可以在继承类中确定泛型:

  • 【Swift】泛型常见使用

    1、Swift泛型4种 泛型函数泛型类型泛型协议泛型约束 2、泛型约束3种 继承约束:泛型类型 必须 是某个类的子...

网友评论

      本文标题:泛型

      本文链接:https://www.haomeiwen.com/subject/fvrazttx.html