Java本土增长的泛型示例

8 java generics

有人能指出我在Java中使用泛型的好例子吗?我是指自己写一个通用类的例子吗?

大多数解释都是"您可以定义这样的泛型类.现在请参阅Java Collections API并忘记所有这些 - 只需使用它并感到高兴."

我想要的更像是"你可以定义这样的泛型类,现在考虑一下你可能想要它的情况,现在让我们看看我们如何编写它."

谢谢.

Apo*_*isp 8

Java中的泛型有助于参数多态性.通过类型参数,您可以将参数传递给类型.就像一个方法,比如String foo(String s)模拟某些行为,不仅仅是针对特定的字符串,而是针对任何字符串s,所以类似于List<T>某种行为的类型,不仅针对特定类型,而且适用于任何类型.List<T>说,对于任何类型的T,存在ListT小号.所以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泛型的这些限制的文章.

可以在此处找到许多有用的泛型类型的来源..如果还没有,请查看标准Java库的源代码.


Var*_*han 0

一些有用的练习:

  • 编写自己的 ArrayList 实现
  • 编写一个基本的 Map 实现(无需担心效率,如果您需要遍历整个数组来查找某些内容,就这样做)
  • 子类化您的 Map impl。使用具有返回写入计数方法的自定义 Map.Entry 对键的值写入进行计数

我无法立即为您提供代码示例,因为我正在研究它们,但也许您可以尝试自己做,如果遇到困难,请回来提出进一步的问题。