美文网首页
泛型 - 类、方法和接口

泛型 - 类、方法和接口

作者: 平头哥2015 | 来源:发表于2018-11-26 17:50 被阅读0次

泛型类

泛型类的语法

  • 声明泛型类:
    class class-name<type-param-list> { }
  • 创建泛型类实例:
    class-name<type-arg-list> instance = new class-name<type-arg-list>(value-arg-list);
  • JDK 7新增的类型推断(省略type-arg-list):
    class-name<type-arg-list> instance = new class-name<>(value-arg-list);

一个类型参数的泛型类

// 声明
public class Generic<T> {

    private T obj;

    public Generic(T obj) {
        this.obj = obj;
    }
    
    // ...
}

// 实例化
Generic<Integer> iInstance = new Generic<Integer>(100);
Generic<String> sInstance = new Generic<>("test"); // 类型推断

两个类型参数的泛型类

public class Generic<T, V> {
    private T first;
    private V second;
    
    public Generic(T first, V second) {
        this.first = first;
        this.second = second;
    }
    
    // ...
}

Generic<Integer, String> instance = new Generic<Integer, String>(100, "test");

注意:

  • 类型参数只能是引用类型,不能使用基本类型。比如下面的声明是非法的:
Generic<int> instance = new Generic<int>(100);
  • 基于不同类型参数的泛型类型是不同的。比如下面的例子不能通过编译:
Generic<Integer> iInstance = new Generic<Integer>(100);
Generic<String> sInstance = new Generic<String>("test");
iInstance = sInstance;

类型边界

可以通过为类型参数声明超类来限定类型参数的边界。声明语法如下所示:
<T extends superclass>
这样就指定了T只能是superclass或其子类。

下面这个例子中sum()调用了Number类的doubleValue方法,如果不指定类型边界为Number,就会编译失败,提示doubleValue()方法是未知的。

public class Calculator<T extends Number> {

    private T[] nums;

    public Calculator(T[] nums) {
        this.nums = nums;
    }

    public double sum() {
        double s = 0.0;
        for (T num : nums) {
            s += num.doubleValue();
        }
        
        return s;
    }

}

除了可以使用类作为边界,还可以指定接口作为边界,而且边界可以是一个类和一个或多个接口。类型参数必须同时满足超类和接口的限制才是合法的。例如:

public class Generic<T extends MyClass & MyInterface> { // ... }

泛型方法

泛型类中的方法可以使用类的类型参数,所以它们是自动相对于类型参数泛型化的。此外,在非泛型类中也可以创建泛型方法。

泛型方法的语法

  • 声明泛型方法:
    <type-param-list> return-type method-name(param-list) { }
  • 声明泛型构造函数:
    <type-param-list> construct-name(param-list) { }

泛型方法的例子

public <T extends Number> boolean check(T num) {
    // ...
}

泛型构造函数的例子

public <T extends Number> Generic(T num) {
    // ...
}

泛型接口

除了可以定义泛型类和泛型方法外,还可以定义泛型接口。

泛型接口的语法

  • 声明泛型接口
    interface interface-name<type-param-list> { }
  • 实现泛型接口
    class class-name<type-param-list> implements interface-name<type-arg-list> { }

例子

public interface MinMax<T extends Comparable<T>> {

    T min();
    
    T max();

}

public class MyClass<T extends Comparable<T>> implements MinMax<T> {

    private T[] values;
    
    // ...

}

注意:

  • 泛型接口的实现类的类型参数必须指定和接口相同的边界。并且一旦指定了边界,就不需要再在implements子句中指定。比如下面的代码是错误的,不能通过编译:
public class MyClass<T extends Comparable<T>>
        implements MinMax<T extends Comparable<T>> {
    // ...
}
  • 如果类实现了泛型接口,那么类也必须是泛型化的。比如下面的类声明是错误的:
public class MyClass implements MinMax<T> {
    // ...
}
  • 如果类实现了某种具体类型的泛型接口,那么实现类不需要是泛型化的。如下所示:
public class MyClass implements MinMax<Integer> {
    // ...
}

相关文章

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

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

  • 泛型

    一、泛型类、泛型接口和泛型方法1、泛型接口的定义: 2、两种泛型类的定义:(1) (2) 3、泛型方法的定义,可以...

  • 泛型的使用

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

  • 三泛型的使用

    1.泛型类和泛型方法 (1)格式 (2)示例例如a.泛型类 b.实现方法 2.泛型接口和泛型方法 (1)格式 (2...

  • Java 泛型

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

  • Java 19-5.1泛型

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

  • 【泛型】通配符与嵌套

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

  • 泛型

    关于泛型类,泛型方法,泛型接口泛型类:public class FanXingLeiDemo {//这里是泛...

  • 泛型简单的应用总结:

    泛型可以应用在类,方法,接口中,可以定义泛型类,泛型方法,泛型接口三种 利用泛型的好处: 可以有效的减少代...

  • 泛型

    问题引入 泛型引入 如果使用泛型类或接口的时候,用Object 通配符 不设置方法类型 泛型接口 定义接口泛型 在...

网友评论

      本文标题:泛型 - 类、方法和接口

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