如何将ducktyping(Python)转换为Java泛型?

2024-03-28 23:27:57 发布

您现在位置:Python中文网/ 问答频道 /正文

以下面的简单Python函数为例:

def quantize(data, nlevels, quantizer=lambda x, d: int(floor(x/d))):
    llim = min(data)
    delta = (max(data) - llim)/(nlevels - 1) # last level x == max(data) only
    y = type(data)
    if delta == 0:
        return y([0] * len(data))
    else:
        return y([quantizer(x - llim, delta) for x in data])

在这里,它正在发挥作用:

^{pr2}$

这个函数当然有缺陷——首先,它不验证参数,它应该更聪明地设置返回值的类型——但它有一个优点:不管数据中的元素是整数还是浮点,还是其他一些数值类型,它都能工作。另外,默认情况下,它返回一个int列表,不过,通过传递一个合适的函数作为可选的量化器参数,这个类型可以更改为其他类型。此外,如果data参数是list,则返回值将是list;如果data是tuple,则返回值将是tuple。(最后一个特性无疑是最薄弱的,但它也是我对在Java中复制最不感兴趣的特性,所以我没有费心使它更健壮。)

我想编写一个与此函数等效的JavaefficientJava,这意味着要找出如何避开Java的类型。自从我学习了Java(很久以前),泛型就被引入到语言中。我尝试过学习Java泛型,但发现它们很难理解。我不知道这是因为早衰,还是因为自从我上一次用Java编程(约2001年)以来Java的复杂性急剧增长,但我发现关于这个主题的每一页都比上一页更令人困惑。如果有人能告诉我如何用Java来实现这一点,我将非常感激。在

谢谢!在


Tags: 函数类型data参数returnjavamaxlist
2条回答

输入/输出类型问题的一个解决方案可能是使用Number类及其子类以及通配符。如果要接受任何类型的数值参数,可以将输入类型指定为Number或{}。如果输入是一个列表,后一种形式有一个优点,因为它可以确保列表中的每个元素都是相同的类型(必须是Number的子类)。?被称为Wildcard,当它表示为? extends Number时,它是一个“有界通配符”,并且只能引用边界类型的一个子类型。在

示例:

public List<Number> func(List<? extends Number> data, Number nlevels)

这将获取Number的一个特定子类的列表,nlevels参数的Number,并返回Number的列表

至于函数输入参数,可以输入Method,尽管此时的类型检查变得很困难,因为您将向Method对象传递有界未知参数的数据。我不太确定那会怎样。在

至于返回类型,可以指定另一个参数,一个列表元素将转换(或转换)到的类对象(很可能是? extends Number)。在

^{pr2}$

这是对Java中函数可能的声明的尝试。然而,实现要稍微复杂一些。在

这不是你所要求的,但我建议你试试看?您可以将Python代码直接编译为Java字节码。由于您从2001年起就没有使用过Java,而且这些天您似乎在使用Python,您可能会发现Jython比事先让自己了解Java中的所有更改要容易得多。在

相关问题 更多 >