2021-04-18 10:58  阅读(67)
文章分类:Java 基础教程 文章标签:JavaJava 教程
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn/java/java-class-instance.html

Java面向对象设计 - Java泛型方法和构造函数

泛型方法

我们可以在方法声明中定义类型参数,它们在方法的返回类型之前的尖括号中指定。

包含泛型方法声明的类型不必是泛型类型。

我们可以在非静态方法声明中使用为泛型类型指定的类型参数。

例子

以下代码显示如何为方法m1()定义新的类型参数V.

新类型参数V强制方法m1()的第一个和第二个参数为相同类型。

第三个参数必须是相同的类型T,这是类实例化的类型。

    class MyBag<T> {
      private T ref;
    
      public MyBag(T ref) {
        this.ref = ref;
      }
    
      public T get() {
        return ref;
      }
    
      public void set(T a) {
        this.ref = a;
      }
    }
    class Test<T>  {
      public <V>  void  m1(MyBag<V>  a, MyBag<V>  b, T  c)  {
      
      }
    }
    

使用泛型方法

要传递方法的形式类型参数的实际类型参数,我们必须在方法调用中的点和方法名之间的尖括号<>中指定它。

    class MyBag<T> {
      private T ref;
    
      public MyBag(T ref) {
        this.ref = ref;
      }
    
      public T get() {
        return ref;
      }
    
      public void set(T a) {
        this.ref = a;
      }
    }
    class Test<T> {
      public <V> void m1(MyBag<V> a, MyBag<V> b, T c) {
      }
    }
    public class Main {
    
      public static void main(String[] argv) {
        Test<String> t = new Test<String>();
        MyBag<Integer> iw1 = new MyBag<Integer>(new Integer(201));
        MyBag<Integer> iw2 = new MyBag<Integer>(new Integer(202));
    
        // Specify that Integer is the actual type for the type parameter for m1()
        t.<Integer>m1(iw1, iw2, "hello");
    
        t.m1(iw1, iw2, "hello");
      }
    }
    

例2

以下代码显示了如何声明泛型静态方法。

我们不能在静态方法内引用包含类的类型参数。

静态方法只能引用它自己声明的类型参数。

以下静态通用类型定义了类型参数T,用于约束参数source和dest的类型。

    class MyBag<T> {
      private T ref;
    
      public MyBag(T ref) {
        this.ref = ref;
      }
    
      public T get() {
        return ref;
      }
    
      public void set(T a) {
        this.ref = a;
      }
    }
    
    public class Main {
      public static <T> void copy(MyBag<T> source, MyBag<? super T> dest) {
        T value = source.get();
        dest.set(value);
      }
    
      public static void main(String[] argv) {
      }
    }
    

要为静态方法调用指定实际的类型参数,我们可以这样做:

    Main.<Integer>copy(iw1, iw2);
    

泛型构造函数

我们可以为构造函数定义类型参数。

下面的代码定义了类Test的构造函数的类型参数U.

它放置一个约束,即构造函数的类型参数U必须是相同的,或者它的类类型参数T的实际类型的子类型。

    public class Test<T> {
      public <U extends T> Test(U k) {
      }
    }
    

要为构造函数指定实际的类型参数值,请在新运算符和构造函数名称之间的尖括号中指定它,如以下代码段所示:

    class Test<T> {
      public <U extends T> Test(U k) {
      }
    }
    
    public class Main {
      public static void main(String[] argv) {
        // Specify the actual type parameter for the constructor as Double
        Test<Number> t1 = new<Double> Test<Number>(new Double(1.9));
    
        // Let the compiler figure out, Integer is
        // the actual type parameter for the constructor
        Test<Number> t2 = new Test<Number>(new Integer(1));
    
      }
    }
    

泛型对象创建中的类型推断

Java 7在泛型类型的对象创建表达式中增加了对类型推断的有限支持。

对于以下语句:

    List<String> list = new ArrayList<String>();
    

在Java 7中,可以在上面的语句中指定空尖括号,称为菱形操作符或简单的菱形<>作为ArrayList的类型参数。

    List<String> list = new ArrayList<>(); 
    

如果我们不在对象创建表达式中为泛型类型指定类型参数,那么类型是原始类型,编译器生成未检查的警告。

例如,以下语句将编译未选中的警告:

    List<String> list = new ArrayList(); // Generates an  unchecked  warning
    

我们不能创建泛型的异常类。并且没有泛型的匿名类。

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java 泛型方法和构造函数
上一篇
Java 泛型约束
下一篇
Java 异常处理