泛型也可以用于接口,例如生成器,这是一种专门负责创意对象的类。实际上是工厂方法设计模式的一种应用。不同的是它不需要任何参数。
一般一个生成器只定义一个方法,该方法用于产生新的 对象。
例子:
public interface Generator<T> { T next(); }
辅助类:
public class Coffee {
private static long counter = 0;
private final long id = counter++;
public String toString() {
return getClass().getSimpleName() + " " + id;
}
}
public class Latte extends Coffee {}
public class Mocha extends Coffee {}
public class Americano extends Coffee {}
实现Generator<Coffer>接口,它能够随机生产不同类型的Offee对象
public class CoffeeGenerator
implements Generator<Coffee>, Iterable<Coffee> {
private Class[] types = { Latte.class, Mocha.class,
Cappuccino.class, Americano.class, Breve.class, };
private static Random rand = new Random(47);
public CoffeeGenerator() {}
// For iteration:
private int size = 0;
public CoffeeGenerator(int sz) { size = sz; }
public Coffee next() {
try {
return (Coffee)
types[rand.nextInt(types.length)].newInstance();
// Report programmer errors at run time:
} catch(Exception e) {
throw new RuntimeException(e);
}
}
class CoffeeIterator implements Iterator<Coffee> {
int count = size;
public boolean hasNext() { return count > 0; }
public Coffee next() {
count--;
return CoffeeGenerator.this.next();
}
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
public Iterator<Coffee> iterator() {
return new CoffeeIterator();
}
public static void main(String[] args) {
CoffeeGenerator gen = new CoffeeGenerator();
for(int i = 0; i < 5; i++)
System.out.println(gen.next());
for(Coffee c : new CoffeeGenerator(5))
System.out.println(c);
}
}
参数化的Generator接口确保next()方法的返回值是参数的类型,
分享到:
相关推荐
接下来,我们讨论泛型类接口。泛型类接口与泛型接口类似,但是它定义了一个泛型类的行为,而不是一个对象的结构。这通常用于定义类的继承关系或者为类的方法提供类型检查。下面是一个例子: ```typescript ...
本笔记主要涵盖了数据基础和泛型编程两大主题,同时也涉及到类和对象、数据类型、类的初始化和加载以及单例模式等多个知识点。 1. **数据基础** - **形参实参的使用**:在函数调用时,形参是方法定义中的参数,而...
- 泛型接口 - 泛型约束 #### 8. LINQ - 查询表达式语法 - 方法语法 - LINQ to Objects与LINQ to SQL #### 9. 命名空间与程序集 - 命名空间的作用 - 程序集的概念与管理 #### 10. 高级主题简介 - Lambda表达式 - ...
接下来,我们讨论泛型接口。泛型接口与泛型类类似,但它们定义了一组方法,而不是实现。它们允许其他类或结构遵循一组特定的合同,而不必知道具体的数据类型。例如,`IEnumerable<T>`接口定义了迭代器的行为,可以...
通过上述讨论,我们可以看到C#中的泛型不仅提供了类型安全性,还极大地提高了代码的重用性和性能。无论是对于简单的数据结构还是复杂的业务逻辑,泛型都能帮助开发者写出更简洁、高效和可靠的代码。希望本文能够帮助...
这个实例185可能是进一步讨论泛型数组类如何应用于实际项目,例如作为缓存、队列或其他数据结构的基础,或者作为工具类帮助处理不同类型的数据集。标签中的"源码"表明可能有具体的代码实现供学习,而"工具"可能意味...
首先,泛型是Java 5引入的一项重要特性,它允许在类、接口和方法中使用类型参数,从而实现泛型类和泛型方法。泛型的主要目标是提供编译时类型检查,防止在集合中存储不兼容的数据类型,避免了强制类型转换的麻烦和...
- **协变和逆变**:在某些情况下,可以允许泛型接口或委托具有协变或逆变性,从而增强其兼容性。 - **默认实现**:有时我们可能希望为泛型结构体提供默认的行为,比如空值检查或默认初始化。 总结起来,xe7结构体...
接下来,我们讨论泛型接口。泛型接口与泛型类相似,只是它们定义在接口中。例如,我们可以定义一个泛型的比较接口: ```java public interface Comparator<T> { int compare(T o1, T o2); } ``` 这个接口可以用于...
- 数据访问接口:定义泛型接口,声明对数据库的操作,如添加、删除、更新和查询。 - 数据访问实现:实现数据访问接口,具体操作数据库,可能使用Entity Framework或其他ORM工具。 - 业务逻辑类:使用泛型创建业务类...
1. **泛型的基本概念**:解释了泛型是什么,以及如何通过使用尖括号`<>`来定义泛型类、泛型接口和泛型方法。 2. **类型参数**:介绍如何定义类型参数,例如`E`、`T`、`K`、`V`等,以及它们在泛型类和泛型方法中的...
本资料主要基于Maurice Naftalin和Philip Wadler合著的《Java泛型和集合》进行讨论。 首先,我们要理解什么是泛型。在Java中,泛型是一种在类、接口和方法中引入类型参数的技术。它们允许我们在编写代码时指定一个...
2. 泛型接口和方法:除了泛型类,我们还可以定义泛型接口和方法,让接口和方法能够处理不同类型的参数。 3. 多态性:泛型提供了编译时的多态性,这意味着我们可以使用相同的方法或类处理不同类型的数据,而无需进行...
泛型是C# 2.0引入的一个重要特性,它允许开发者在定义类、接口、方法和委托时声明类型参数,这样在实例化时可以指定具体的类型,从而提高了代码的灵活性和重用性。通过使用泛型,我们可以避免类型转换的麻烦,减少...
泛型是Java 5引入的一个重要特性,它允许在类、接口和方法中使用类型参数,从而增强了代码的类型安全性。通过使用泛型,我们可以在编译时就检测到可能的类型错误,而不是在运行时发现。例如,`List<String>` 就是一...
在Java编程语言中,泛型是一种强大的特性,它允许我们在类、接口和方法中使用类型参数,从而提高代码的灵活性和安全性。当我们谈论“继承泛型类”时,这意味着一个类(子类)正在扩展一个已经定义了泛型的类(父类)...
下面将详细讨论Java中泛型的使用及相关知识点。 1. 泛型的基本概念 泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法中使用类型参数。类型参数类似于函数参数,但它们代表的是类型而不是值。例如,`List<T>`...
接下来,我们要讨论泛型的原理。泛型的本质是类型擦除,这意味着在编译后的字节码中,所有的类型参数都会被替换为它们的边界类型(通常是`Object`)。然而,编译器会插入强制类型转换和检查,以确保在运行时的类型...
泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可读性。在`BaseDao.java`中,可能会定义一个泛型基类,如: ```java public abstract class BaseDao<T> { public...
接下来,我们讨论泛型。泛型是Java SE 5.0引入的新特性,它允许在定义类、接口和方法时使用类型参数,以实现参数化类型。这样做的好处在于可以在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了...