使用泛型为特定类型扩展类

时间:2013-04-08 11:51:18

标签: java generics

我在想。我有class OccList<T>。我很好用OccList保存任何对象,但如果T是一个字符串,或者如果T是一个整数,我想做更多。

在做这件事时我有什么办法可以使用相同的名字吗?到目前为止,我的解决方案是创建一个新类class StringOccList extends OccList<String>。最好我希望能够使用OccList<String>并让java根据使用的类型创建适当的类,就像方法签名一样。可能吗?有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

它必须是一个不同的类,除非您希望添加的功能成为基类的一部分。

想一想;假设您有一个方法printAll,可以在列表的所有内容上调用System.out.println。方法将去哪里?

  1. 如果方法是String,您只希望该方法可以调用。然后它不能成为基类的一部分(因为否则它将在基类中定义),所以你需要使用不同的类,如StringOccList
  2. 如果方法在基类中可调用,那也没关系。您可以编写它(在String的情况下)它在所有成员上调用T.toString,或者如果T不是合适的类型,您可以让该方法抛出异常。
  3. 这就是“通用”的含义 - 该类适用于任何类型的内部类型。如果它不适用于任何类型的内部类型,那么它就不再是通用了!

答案 1 :(得分:-1)

是的,您可以使用Java推断类型的一个地方,即方法返回。想象一下,你需要OccList String,但你不想这样做

OccList<String> list = new OccList<String>();

那么,你只需要写一个方法来做到这一点。像这样:

public static <E> OccList<E> newOccList(){
    return new OccList();
}

并像这样调用它:

OccList<String> stringList = newOccList();
OccList<Integer> integerList = newOccList();
OccList<File> fileList = newOccList();

它适用于您需要的任何通用类型。

这在Google Guava库中使用,请参阅here