`

Javar泛型方法及动态参数

 
阅读更多

(1) 如何创建泛型方法

  我们用例子来说明一下如何创建一个泛型方法:

  

      class Lists {

  public static List toList(T[] arr) {

  List lists = new ArrayList();

  for(T element : arr) {

  lists.add(element);

  }

  return lists;

  }

  }

  我们可以这样进行调用

  List ints = Lists.toList(new Integer[]{1, 2, 3});

  List words = Lists.toList(new String[]{“a”, “b”, “c”});

  上面例子的方法签名的第一个,初看起来比较奇怪,和我们传统的方法签名并不相同,这个表示为我们的方法声明一个类型变量(type variable),该类型变量被应用于方法签名及方法体,这个类型变量的作用域仅限于该方法本身。

  (2) vararg(动态参数)的应用

  将参数打包成一个数组传入方法中是一件让人讨厌的事,在jdk1.5中加入了一个新的功能称为vararg(动态参数),让我们来看看示例

  

      class Lists {

  public static List toList(T… arr) {

  List lists = new ArrayList();

  for(T element : arr) {

  lists.add(element);

  }

  return lists;

  }

  }

  Lists ints = Lists.toList(1,2,3);

  我们看到”…”就表示方法接受动态参数,其实在运行时的时候,调用方法的参数,也是被打包成一个数组传入,只不过这一次是jvm帮我们做了。

所以我们也可以采用以下的方法进行调用:

  

      Lists ints = Lists.toList(new Integer[]{1,2,3});
  不过在使用vararg功能时,需要留意的是,当方法中待传入的参数除了动态参数外,还有其它参数,则必须将动态参数方法在参数列表的最后面,例如:

  

      public static void addAll(List list, T… arr);
  (3) 调用泛型方法时显式给定类型参数的问题

  我们在调用泛型方法时,还有一个要注意的地方是,是否在调用时显式地写明类型参数(type parameter),例如:

  < 1>List< Integer> ints = Lists< Integer>.toList();

  < 2>List< Object> objs = Lists< Object>.toList(1, “abc”);

  一般的情况下,其实都不需要显式地指明类型参数,但对于上面的两种情况,可能就非常有必要。

  上面的< 1>式,我们没有传入任何参数,这样的话,类型推断算法就无法确定在方法内部的类型是什么了。

  上面的< 2>式,我们第一个参数传入整数,第二个参数传入字符串,你可能会认为,类型推断算法应该会推断出Integer及String的基类是Object,但是Integer及String,同时实现了Serializable和Comparable接口,这样类型推断算法就不能在这三者中作出正确的选择了。

分享到:
评论

相关推荐

    java泛型技术之发展

    3. 泛型的引入:Java SE 5.0正式引入泛型,允许在类、接口和方法中声明参数化类型,使得编译器能够在编译时期检测类型错误,提高了代码质量。 4. 普及与优化:随着Java泛型的广泛应用,JDK 6和7对其进行了进一步...

    javar练习200题

    "javar练习200题" 提供了一个强化Java技能的机会,涵盖了基础到进阶的各种概念,适合不同水平的Java学习者。这个练习集合旨在帮助你巩固理论知识,并通过实践提升编程技巧。 1. **基础语法** - 变量声明与数据类型...

    泛型、反射 实现 O/R mapping 示例

    首先,泛型是Java 5引入的一个重要特性,它允许我们在定义类、接口和方法时指定参数类型。这样可以确保在编译期间就能捕获类型错误,提高代码的可读性和安全性。在O/R Mapping中,我们可以创建一个泛型类来表示...

    Java8中lambda表达式的应用及一些泛型相关知识

    泛型在这里也发挥了重要作用,`groupBy`方法的泛型参数`&lt;K&gt;`允许我们使用任何类型作为分组键。这样,我们就可以将分组逻辑从具体实现中解耦出来,提高了代码的可重用性和可维护性。 总结来说,Java8的Lambda表达式...

    Spring中初始化泛型类的方法实例

    泛型允许我们在类、接口和方法中定义类型参数,以实现类型安全的代码。例如,定义一个简单的泛型类`Processor&lt;T&gt;`: ```java class Processor&lt;T&gt; {} ``` 在Java中,我们可以直接创建带有具体类型的实例,如`...

    java泛型源码-GENESIS:通用源代码预处理器

    java泛型源码 创世记 通用源代码预处理器。 动机 向JavaScript,Go和其他类似语言添加以下功能: 一个功能强大的类似于C的预处理器,具有多令牌变量和函数,局部和全局作用域,包含,导入,赋值,表达式,条件,循环...

    JAVA笔试题目及JAVA常考知识点总结.pdf

    - 泛型方法定义使用,R&gt;或等表示泛型参数。 4. Java异常处理 - Java异常处理使用try、catch、finally和throw关键字。 - try块用于捕获异常,catch块用于处理异常,finally块用于执行清理工作。 - throw关键字...

    java加强笔记

    - 可以自定义泛型方法来处理泛型参数。 ##### 6. 自定义泛型类的应用 - 泛型类允许创建类型安全的对象,可以自定义泛型类来实现特定的功能。 #### 八、类加载器的深入讲解与应用 ##### 1. 类加载器及其委托机制的...

    java编程的逻辑(高清百度盘)

    泛型提供了一种参数化类型的方法,允许在类、接口和方法中使用类型参数。 2. **枚举(Enumerations)**:枚举是一种特殊的类,用于定义一个固定的实例集合。Java 5之前,通常使用整型或字符串来表示一组固定值,但...

    java8传函数方法图文详解

    5. **泛型类和泛型方法中的函数方法**: 泛型允许我们定义类型参数化的类和方法,而函数方法可以在泛型类或方法中使用。例如,你可以定义一个泛型方法 `public &lt;T&gt; List&lt;T&gt; applyOperation(List&lt;T&gt; list, Function, T...

    java定义受限制的类型参数操作

    Java 语言中,类型参数是泛型编程的核心概念之一。类型参数可以是没有限制的,也可以是受限制的。今天,我们将主要介绍 Java 中定义受限制的类型参数操作。 首先,让我们来了解什么是受限制的类型参数。受限制的...

    java高级应用简笔

    Java中使用了泛型擦除机制,这意味着在运行时,类的泛型信息会被擦除。因此,反射操作时无法直接获得泛型信息。需要使用以下接口: - **`ParameterizedType`**:表示带泛型的参数类型,例如`List&lt;String&gt;`。 - **`...

    DynamicComparator:Java 动态比较器

    动态比较器可以接收一个函数式接口作为参数,如`Function, R&gt;`,这个接口代表了对象到比较值的映射。这样,比较规则可以在运行时动态改变。例如,我们可以创建一个泛型的`DynamicComparator`类: ```java public ...

    采用各种排序算法,支持任意类型数据的小型排序系统

    首先,**泛型**是Java编程语言中的一个关键特性,它允许在定义类、接口和方法时使用类型参数,从而提高了代码的重用性和安全性。在这个排序系统中,泛型的应用使得系统能处理不同类型的数据,如整数、浮点数、字符串...

    java8 官方文档.

    10. **类型接口推断**:编译器现在可以更智能地推断泛型类型的参数,使得代码更简洁,如`Map, Integer&gt; map = new HashMap();` Java 8官方文档详细解释了这些特性的使用和原理,同时还包含了API参考、教程、示例...

    java8的10大特性

    - **Function, R&gt;**:接受类型T的参数,返回类型R的结果。提供了`apply()`方法和组合方法如`compose()`、`andThen()`。 ```java Function, Integer&gt; toInteger = Integer::valueOf; Function, String&gt; ...

    Java1.8 API离线文档

    10. **类型注解**:Java 1.8引入了类型注解,允许在类型声明(包括泛型参数)上使用注解,增强了代码的可读性和验证性。 以上只是Java 1.8 API文档中部分关键更新和特性,实际文档包含了更丰富的信息,包括每个类、...

    java8参考手册

    Lambda表达式可以作为方法参数,也可以用作返回值。 - **函数接口**:为了支持lambda表达式,Java 8定义了一些重要的函数接口,如`Function,R&gt;`、`Predicate&lt;T&gt;`、`Consumer&lt;T&gt;`和`Supplier&lt;T&gt;`,它们分别代表了一...

    Java8新特性教程(含代码).docx

    使用两个泛型参数,结合 Stream API 实现了字符串列表到长度映射的转换。 #### 四、Java 8 内置的核心函数式接口 1. **Consumer**: 消费型接口(无返回值,需要传参数) - 方法签名:`void accept(T t);` 2. **...

Global site tag (gtag.js) - Google Analytics