组合泛型边界是反模式吗?

问题描述 投票:0回答:3

作为我的上一个问题的后续

拥有一个具有组合通用边界的函数,例如:

<T extends Foo & Bar> void doStuff(T argument) {
  //do stuff which should only be done if arguments is both foo and bar
}

因为这不能从未指定的对象进行转换,所以您需要了解实际实现这些接口的某个对象。在我看来,需要知道传递给

doStuff(T a)
的对象参数的具体类型违反了德米特定律。

该函数没有指定需要了解实际的类(可能有很多不同的类),而且我真的不想知道它,因为了解这个类会增加我的代码库中的依赖性。

使用这些边界是反模式吗?如果是这样,应该如何最好地避免它?

该案例场景涉及一个接口,指定对象是持久的,而另一个指定对象具有相关实体。本例中的

doStuff(T a)
函数在持久化相关实体时对其进行持久化。然而,非持久实体也可以有相关实体,但不应该由
doStuff(T a)
函数处理

java generics interface anti-patterns
3个回答
4
投票

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

<T extends Number & Comparable<T>> T max(Collection<T> numbers)

2
投票

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

我不同意。我不明白如何

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

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

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

甚至更多

void doStuff(T argument) 

在所有情况下,你都需要了解一些关于论证的知识,我认为第一种情况不需要比其他情况更多的知识,因为它有两个标识符。


0
投票

反模式正在铸造。

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

© www.soinside.com 2019 - 2024. All rights reserved.