专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
目录
相关文章推荐
芋道源码  ·  Java 新魔法:利用 Function ... ·  21 小时前  
芋道源码  ·  裁员天花板:全员降薪40%,“闲置员工” ... ·  21 小时前  
芋道源码  ·  300 秒到 4 秒,如何将 MySQL ... ·  2 天前  
芋道源码  ·  船新 IDEA 2025.1 要来了,新特性真香! ·  3 天前  
芋道源码  ·  DeepSeek 全面指南:95% ... ·  4 天前  
51好读  ›  专栏  ›  java那些事

Java泛型基础

java那些事  · 公众号  · Java  · 2018-12-14 16:00

正文

作者丨Seandy
https://www.jianshu.com/p/c8ac39183522


Java泛型基础


1. 认识泛型


  • 泛型是在JDK1.5之后增加的新功能.

  • 泛型可以解决数据的安全性问题, 主要的原理是在类声明的时候通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型.

  • 格式:



访问权限 class 类名称{
属性
方法
}


  • 对象的创建:

    类名称 对象名称 = new 类名称();

  • 示例


/**
* 经纬度
*
* @author dixin
*
*/

class Point {
private T x;
private T y;

public T getX () {
return x;
}

public void setX (T x) {
this .x = x;
}

public T getY () {
return y;
}

public void setY (T y) {
this .y = y;
}
}

public class GenericDemo01 {

public static void main (String[] args) {

Point p1 = new Point ();
p1.setX( "经度为10" );
p1.setY( "纬度为100" );

Point p2 = new Point ();
p2.setX( 10 );
p2.setY( 100 );

System.out.println(p1.getX() + ", " + p1.getY());
System.out.println(p2.getX() + ", " + p2.getY());
}
}

// 执行结果
经度为 10 , 纬度为 100
10 , 100


2. 构造方法中使用泛型


class Con {

private T value;
// 类定义中已经定义泛型T, 方法中可以直接使用, 不用加<>
public Con (T value) {
this .value = value;
}

public T getValue () {
return value;
}

public void setValue (T value) {
this .value = value;
}
}

public class GenericDemo02 {

public static void main (String[] args) {
Con c = new Con ( "构造方法中使用泛型" );
System.out.println(c.getValue());
}
}


3. 设置多个泛型


两个泛型的例子:


class Gen {

private K key;
private T value;

public K getKey () {
return key;
}

public void setKey (K key) {
this .key = key;
}

public T getValue () {
return value;
}

public void setValue (T value) {
this .value = value;
}

}

public class GenericDemo03 {

public static void main (String[] args) {
Gen gen = new Gen ();
gen.setKey( "key" );
gen.setValue( 10 );

System.out.println(gen.getKey() + ", " + gen.getValue());
}
}


4. 通配符


类型不统一问题


class Info {

private T value;

public void setValue (T value) {
this .value = value;
}

public T getValue () {
return value;
}

@ Override
public String toString ()
{
return this .getValue().toString();
}
}

public class GenericDemo04 {

public static void main (String[] args) {
Info i = new Info ();
i.setValue( "类型不统一" );
tell(i); // 编译报错
// The method tell(Info) in the type GenericDemo04 is not applicable for the arguments
(Info )
}

public static void tell (Info i) {
System.out.println(i);
}
}


原因:

泛型是不可变的, 对于任意两个不同的类型Type1和Type2, List 既不是List 的子类型, 也不是List 的父类型. 所以这里不能将 转换成.


解决方式:

  • public static void tell(Infoi)中去掉, 使用raw类型, 但这样就失去了泛型的安全性检查意义.



  • 更好的方式, 采用通配符.

    修改为public static void tell(Info i)

  • 5. 泛型接口


    • 声明泛型接口和声明泛型类的语法类似, 也是在接口名称后面加上 .

    • 格式:

      interface 接口名称

    示例:


    interface IGen < T > {
    public void say () ;
    }

    class GenImpl < T > implements IGen < T > {

    private String info;

    public GenImpl (String info) {
    this .info = info;
    }

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

    public String getInfo () {
    return info;
    }

    @Override
    public void say () {
    System.out.println( this .info);
    }
    }

    public class GenericDemo05 {

    public static void main (String[] args) {
    IGen g = new






请到「今天看啥」查看全文