以下面的简单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来实现这一点,我将非常感激。在
谢谢!在
输入/输出类型问题的一个解决方案可能是使用}。如果输入是一个列表,后一种形式有一个优点,因为它可以确保列表中的每个元素都是相同的类型(必须是Number的子类)。
Number
类及其子类以及通配符。如果要接受任何类型的数值参数,可以将输入类型指定为Number
或{?
被称为Wildcard,当它表示为? extends Number
时,它是一个“有界通配符”,并且只能引用边界类型的一个子类型。在示例:
这将获取
Number
的一个特定子类的列表,nlevels参数的Number
,并返回Number
的列表至于函数输入参数,可以输入
Method
,尽管此时的类型检查变得很困难,因为您将向Method
对象传递有界未知参数的数据。我不太确定那会怎样。在至于返回类型,可以指定另一个参数,一个列表元素将转换(或转换)到的类对象(很可能是
^{pr2}$? extends Number
)。在这是对Java中函数可能的声明的尝试。然而,实现要稍微复杂一些。在
这不是你所要求的,但我建议你试试看?您可以将Python代码直接编译为Java字节码。由于您从2001年起就没有使用过Java,而且这些天您似乎在使用Python,您可能会发现Jython比事先让自己了解Java中的所有更改要容易得多。在
相关问题 更多 >
编程相关推荐