(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接口,这样类型推断算法就不能在这三者中作出正确的选择了。
分享到:
相关推荐
3. 泛型的引入:Java SE 5.0正式引入泛型,允许在类、接口和方法中声明参数化类型,使得编译器能够在编译时期检测类型错误,提高了代码质量。 4. 普及与优化:随着Java泛型的广泛应用,JDK 6和7对其进行了进一步...
"javar练习200题" 提供了一个强化Java技能的机会,涵盖了基础到进阶的各种概念,适合不同水平的Java学习者。这个练习集合旨在帮助你巩固理论知识,并通过实践提升编程技巧。 1. **基础语法** - 变量声明与数据类型...
首先,泛型是Java 5引入的一个重要特性,它允许我们在定义类、接口和方法时指定参数类型。这样可以确保在编译期间就能捕获类型错误,提高代码的可读性和安全性。在O/R Mapping中,我们可以创建一个泛型类来表示...
泛型在这里也发挥了重要作用,`groupBy`方法的泛型参数`<K>`允许我们使用任何类型作为分组键。这样,我们就可以将分组逻辑从具体实现中解耦出来,提高了代码的可重用性和可维护性。 总结来说,Java8的Lambda表达式...
泛型允许我们在类、接口和方法中定义类型参数,以实现类型安全的代码。例如,定义一个简单的泛型类`Processor<T>`: ```java class Processor<T> {} ``` 在Java中,我们可以直接创建带有具体类型的实例,如`...
java泛型源码 创世记 通用源代码预处理器。 动机 向JavaScript,Go和其他类似语言添加以下功能: 一个功能强大的类似于C的预处理器,具有多令牌变量和函数,局部和全局作用域,包含,导入,赋值,表达式,条件,循环...
- 泛型方法定义使用,R>或等表示泛型参数。 4. Java异常处理 - Java异常处理使用try、catch、finally和throw关键字。 - try块用于捕获异常,catch块用于处理异常,finally块用于执行清理工作。 - throw关键字...
- 可以自定义泛型方法来处理泛型参数。 ##### 6. 自定义泛型类的应用 - 泛型类允许创建类型安全的对象,可以自定义泛型类来实现特定的功能。 #### 八、类加载器的深入讲解与应用 ##### 1. 类加载器及其委托机制的...
泛型提供了一种参数化类型的方法,允许在类、接口和方法中使用类型参数。 2. **枚举(Enumerations)**:枚举是一种特殊的类,用于定义一个固定的实例集合。Java 5之前,通常使用整型或字符串来表示一组固定值,但...
5. **泛型类和泛型方法中的函数方法**: 泛型允许我们定义类型参数化的类和方法,而函数方法可以在泛型类或方法中使用。例如,你可以定义一个泛型方法 `public <T> List<T> applyOperation(List<T> list, Function, T...
Java 语言中,类型参数是泛型编程的核心概念之一。类型参数可以是没有限制的,也可以是受限制的。今天,我们将主要介绍 Java 中定义受限制的类型参数操作。 首先,让我们来了解什么是受限制的类型参数。受限制的...
Java中使用了泛型擦除机制,这意味着在运行时,类的泛型信息会被擦除。因此,反射操作时无法直接获得泛型信息。需要使用以下接口: - **`ParameterizedType`**:表示带泛型的参数类型,例如`List<String>`。 - **`...
动态比较器可以接收一个函数式接口作为参数,如`Function, R>`,这个接口代表了对象到比较值的映射。这样,比较规则可以在运行时动态改变。例如,我们可以创建一个泛型的`DynamicComparator`类: ```java public ...
首先,**泛型**是Java编程语言中的一个关键特性,它允许在定义类、接口和方法时使用类型参数,从而提高了代码的重用性和安全性。在这个排序系统中,泛型的应用使得系统能处理不同类型的数据,如整数、浮点数、字符串...
10. **类型接口推断**:编译器现在可以更智能地推断泛型类型的参数,使得代码更简洁,如`Map, Integer> map = new HashMap();` Java 8官方文档详细解释了这些特性的使用和原理,同时还包含了API参考、教程、示例...
- **Function, R>**:接受类型T的参数,返回类型R的结果。提供了`apply()`方法和组合方法如`compose()`、`andThen()`。 ```java Function, Integer> toInteger = Integer::valueOf; Function, String> ...
10. **类型注解**:Java 1.8引入了类型注解,允许在类型声明(包括泛型参数)上使用注解,增强了代码的可读性和验证性。 以上只是Java 1.8 API文档中部分关键更新和特性,实际文档包含了更丰富的信息,包括每个类、...
Lambda表达式可以作为方法参数,也可以用作返回值。 - **函数接口**:为了支持lambda表达式,Java 8定义了一些重要的函数接口,如`Function,R>`、`Predicate<T>`、`Consumer<T>`和`Supplier<T>`,它们分别代表了一...
使用两个泛型参数,结合 Stream API 实现了字符串列表到长度映射的转换。 #### 四、Java 8 内置的核心函数式接口 1. **Consumer**: 消费型接口(无返回值,需要传参数) - 方法签名:`void accept(T t);` 2. **...