有人能指出我在Java中使用泛型的好例子吗?我是指自己写一个通用类的例子吗?
大多数解释都是"您可以定义这样的泛型类.现在请参阅Java Collections API并忘记所有这些 - 只需使用它并感到高兴."
我想要的更像是"你可以定义这样的泛型类,现在考虑一下你可能想要它的情况,现在让我们看看我们如何编写它."
谢谢.
Java中的泛型有助于参数多态性.通过类型参数,您可以将参数传递给类型.就像一个方法,比如String foo(String s)模拟某些行为,不仅仅是针对特定的字符串,而是针对任何字符串s,所以类似于List<T>某种行为的类型,不仅针对特定类型,而且适用于任何类型.List<T>说,对于任何类型的T,存在List的T小号.所以List实际上是一个类型构造函数.它将一个类型作为参数,并构造另一个类型作为结果.
以下是我每天使用的泛型类型的几个示例.首先,一个非常有用的通用接口:
public interface F<A, B> {
public B f(A a);
}
Run Code Online (Sandbox Code Playgroud)
这个接口表示对于任何两种类型,A并且B,有一个函数(被调用f)接受A并返回一个B.当你实现这个接口,A并且B可以是任何你想要的类型,只要你提供一个函数f,是以前者,并返回后者.这是接口的示例实现:
F<Integer, String> intToString = new F<Integer, String>() {
public String f(int i) {
return String.valueOf(i);
}
}
Run Code Online (Sandbox Code Playgroud)
在泛型之前,通过使用关键字进行子类化来实现多态性extends.使用泛型,我们实际上可以取消子类化并使用参数多态.例如,考虑用于计算任何类型的哈希码的参数化(通用)类.而不是重写Object.hashCode(),我们将使用这样的泛型类:
public final class Hash<A> {
private final F<A, Integer> hashFunction;
public Hash(final F<A, Integer> f) {
this.hashFunction = f;
}
public int hash(A a) {
return hashFunction.f(a);
}
}
Run Code Online (Sandbox Code Playgroud)
这比使用继承更灵活,因为我们可以保持使用组合和参数多态的主题,而不会锁定脆弱的层次结构.
Java的泛型并不完美.例如,您可以抽象类型,但不能抽象类型构造函数.也就是说,您可以说"对于任何类型T",但您不能说"对于任何类型T采用类型参数A".
可以在此处找到许多有用的泛型类型的来源..如果还没有,请查看标准Java库的源代码.
一些有用的练习:
我无法立即为您提供代码示例,因为我正在研究它们,但也许您可以尝试自己做,如果遇到困难,请回来提出进一步的问题。
| 归档时间: |
|
| 查看次数: |
7365 次 |
| 最近记录: |