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