【发布时间】:2013-06-12 18:03:00
【问题描述】:
我正在学习 Java,但我相信这个问题不是特定于语言的。抱歉,如果有人已经问过这个问题,我不知道如何在搜索查询中表达这个问题。
在为自己实现了一些泛型方法后不久,我意识到:由于泛型允许您使用更多类型的参数,因此用户输入的某些参数可能没有您期望的功能。我想出的一个“hack”是使用接口作为上限来限制参数输入类型。对于像 compareTo() 这样的流行功能,这很好,因为接口 Comparable 已经足够流行了,但是我发现我不得不编写一个自定义接口来让我的泛型工作很尴尬。
这里有一些代码可以帮助理解我的废话。考虑以下尝试计算通用数据类型集合中唯一元素的非工作代码:
public static <T> int countUnique(Collection<T> c) {
int count = 0;
for(T t : c) {
count += (t.isUnique()) ? (1) : (0);
}
return count;
}
当编译器抱怨对象t 没有(或者更确切地说,编译器无法确定它们有)方法isUnique() 时,就会出现一个明显的问题。我的解决方案:
public interface unique {
public boolean isUnique();
}
public static <T extends unique> int countUnique(Collection<T> c) {
int count = 0;
for(T t : c) {
count += (t.isUnique()) ? (1) : (0);
}
return count;
}
问题是:我必须每次都这样做吗?是不是很笨重?有没有我应该采用的标准做法?
【问题讨论】:
-
我必须每次都这样做吗? 仅当您需要时。 是否有我应该采用的标准做法? AFAIK,没有。
-
你真正想要的是一个 lambda 参数,但 Java 不支持。
-
@SLaks Java 8 将支持 Lambda 表达式,但这更多的是在客户端,除非我遗漏了某些东西(通常是这种情况)。我不确定 lambda 将如何帮助解决我的问题。
-
你可以让像
countUnique()这样的方法采用一个lambda(T),在每个元素上调用类似isUnique()的东西,而不是使用接口。
标签: java generics interface restriction