作为对previous question的跟进 具有组合通用边界的函数,例如:
<T extends Foo & Bar> void doStuff(T argument) {
//do stuff wich should only be done if arguments is both foo and bar
}
因为这不能从未指定的对象转换,所以您需要了解实际实现这些接口的某个对象。在我看来,需要知道传递给doStuff(T a)
的对象参数的具体类型是违反德米特定律的。
该函数没有指定需要知道实际的类(可能有许多不同的类),我真的不想知道它,因为知道这个类增加了我的代码库中的依赖。
使用这些边界的反模式?如果是这样,最好如何避免它?
案例场景涉及一个接口,指定对象是持久的,另一个指定对象具有相关实体。在这种情况下,doStuff(T a)
函数在持久化时保留了相关实体。但是,非持久性实体也可以拥有相关实体,但不应由doStuff(T a)
函数
答案 0 :(得分:3)
我不会将组合泛型边界视为反模式。至少我的代码中有一些用途。例如,以下示例代码使用Comparable接口中的compareTo查找集合中的最大Number实例:
<T extends Number & Comparable<T>> T max(Collection<T> numbers)
答案 1 :(得分:1)
在我看来,需要知道传递给doStuff(T a)的对象参数的特定类型是违反Demeter定律的
我不同意。我不知道如何
T<? extends Foo & Bar> void doStuff(T argument)
需要更多的参数知识才能通过
T<? extends Foo> void doStuff(T argument)
甚至更多只是
void doStuff(T argument)
在所有情况下,你需要了解一些关于论证的事情,我不认为第一个案例要求更多的知识,因为它有两个标识符。
答案 2 :(得分:0)
反模式正在铸造。
然而,花哨的泛型步法可能会让非高级程序员感到困惑。这些类型和方法的使用应该比它们的实现容易得多。