2

作为对我之前的问题的跟进 具有组合通用边界的函数,例如:

<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)函数处理

4

3 回答 3

4

我不会认为组合的通用边界是反模式。至少我在我的代码中有一些用途。例如,以下示例代码使用 Comparable 接口中的 compareTo 查找集合中最大的 Number 实例:

<T extends Number & Comparable<T>> T max(Collection<T> numbers)
于 2008-11-26T10:39:27.127 回答
2

在我看来,需要知道传递给 doStuff(T a) 的对象参数的具体类型违反了得墨忒耳定律

我不同意。我不明白如何

T<? extends Foo & Bar> void doStuff(T argument) 

需要更多的论据知识才能通过

T<? extends Foo> void doStuff(T argument) 

甚至更多

void doStuff(T argument) 

在所有情况下,您都需要对参数有所了解,我认为第一种情况不需要比其他情况更多的知识,因为它有两个标识符。

于 2008-11-26T11:06:08.413 回答
0

反模式是铸造。

然而,花哨的泛型步法可能会让非高级程序员感到困惑。这种类型和方法的使用应该比它们的实现容易得多。

于 2008-11-26T11:19:13.053 回答