我想知道。我有一个class OccList<T>
. 我对 OccList 持有任何对象都很好,但是如果 T 是一个字符串,或者如果 T 是一个整数,我想做更多的事情。
有什么办法可以在做的时候使用相同的名字吗?到目前为止,我的解决方案是创建一个新类class StringOccList extends OccList<String>
。理想情况下,我希望能够使用OccList<String>
并让 java 根据使用的类型创建适当的类,就像方法签名一样。可能吗?有更好的解决方案吗?
它必须是不同的类,除非您希望添加的功能成为基类的一部分。
想想看;假设您有一个printAll
调用System.out.println
列表所有内容的方法。方法将走向何方?
String
. 那么它不能是基类的一部分(因为否则它会在基类中定义),所以你需要使用不同的类,比如StringOccList
String
)它调用T.toString
所有成员,或者如果 T 不是适当的类型,您可以让该方法抛出异常。这就是“泛型”的含义——该类适用于任何类型的内部类型。如果它不适用于任何类型的内部类型,那么它就不再是通用的了!
是的,您可以利用 Java 推断类型的一个地方,即方法返回。想象一下你想要一个OccList
of 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();
它适用于您需要的任何通用类型。
这是在谷歌番石榴库中使用的,请参考这里