- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
通过示例考虑以下简单的 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])
这是实际操作:
>>> from random import random
>>> data = [10*random() for _ in range(10)]
>>> data
[6.6181668777075018, 9.0511321773967737, 1.8967672216187881, 7.3396890304913951,
4.0566699095012835, 2.3589022034131069, 0.76888247730320769, 8.994874996737197,
7.1717500363578246, 2.887112256757157]
>>> quantize(data, nlevels=5)
[2, 4, 0, 3, 1, 0, 0, 3, 3, 1]
>>> quantize(tuple(data), nlevels=5)
(2, 4, 0, 3, 1, 0, 0, 3, 3, 1)
>>> from math import floor
>>> quantize(data, nlevels=5, quantizer=lambda x, d: (floor(x/d) + 0.5))
[2.5, 4.5, 0.5, 3.5, 1.5, 0.5, 0.5, 3.5, 3.5, 1.5]
这个函数当然有缺陷——一方面,它不验证参数,它应该更聪明地设置返回值的类型——但它的优点是无论元素是否有效in data 是整数或 float 或其他一些数字类型。此外,默认情况下它返回一个整数列表,不过,通过将合适的函数作为可选的量化器参数传递,可以将此类型更改为其他类型。此外,如果数据参数是一个列表,则返回值将是一个列表;如果数据是一个元组,则返回值将是一个元组。 (这最后一个特性当然是最弱的一个,但它也是我最不想在 Java 中复制的一个特性,所以我没有费心让它变得更健壮。)
我想编写一个高效 Java 等效函数,这意味着弄清楚如何绕过 Java 的类型。自从我学习 Java(很久以前)以来,泛型就被引入了该语言。我尝试学习 Java 泛型,但发现它们非常难以理解。我不知道这是由于早发性衰老,还是因为自从我上次使用 Java 编程(大约 2001 年)以来 Java 的复杂性急剧增加,但我发现关于这个主题的每一页都比前一页更令人困惑一。如果有人能告诉我如何用 Java 执行此操作,我将不胜感激。
谢谢!
最佳答案
输入/输出类型问题的一个解决方案可能是使用 Number
类及其子类以及通配符。如果您想接受任何类型的数字参数,您可以将输入类型指定为 Number
或 ?扩展数字
。如果输入是一个列表,后一种形式有一个优势,因为它将确保列表中的每个元素都是相同的类型(必须是 Number 的子类)。 ?
被称为 Wildcard , 什么时候表示为 ? extends Number
它是一个“有界通配符”,并且只能引用边界类型的子类型。
例子:
public List<Number> func(List<? extends Number> data, Number nlevels)
这将采用 Number
的特定子类列表,nlevels 参数的 Number
,并返回 列表>数字
至于函数输入参数,可以输入一个Method
,尽管此时的类型检查变得困难,因为您会将一个有界未知参数的数据传递给一个方法
对象。我不确定这将如何工作。
至于返回类型,可以指定另一个参数,一个类对象(可能是 ? extends Number
再次),列表元素将被转换(或转换)到。
public List<? extends Number> quantize(List<? extends Number> data,
Number nlevels,
Method quantizer,
Class<? extends Number> returnType)
这是对您在 Java 中的函数的可能声明的尝试。然而,实现稍微复杂一些。
关于java - 如何将这种鸭子类型(duck typing)(Python)转换为 Java 泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915265/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我习惯于动态类型意味着在运行时检查对象/非面向对象结构的类型信息并抛出某种类型错误,即如果它像鸭子类型(duck typing)一样嘎嘎叫,它就是一只鸭子类型(duck typing)。是否有不同类型
这是《Practical Object-Oriented Design in Ruby》书中的一个示例。我有兴趣将这个 ruby 代码翻译成 javascript,以便更好地理解 JS 中的鸭子类
我又在 Scala 闲逛,我希望这是一个关于鸭子类型的基本问题,或者它可能真的与函数定义有关。让我解释: 鉴于以下代码: package johnmcase.scala.oneoffs object
Typescript 在某些情况下执行“鸭子”键入,例如当您针对接口(interface)检查函数参数的有效性时。 例如: interface Named { name: string } fun
代替遍历集合,有时在过程上循环遍历它们更方便。为了避免根据输入区分$_和$_.Key / $_.Value,更一致的键/值处理将是不错的: ForEach-KV $object { Param($k,
我正在使用带有继承的面向对象方法来解决问题,并且我想知道如何将“鸭子类型(duck typing)”原则应用于此问题。 我有一个类 BoxOfShapes ,它将使用 Shapes 列表(Circle
我正在尝试找到一种方法来为继承一对相似接口(interface)的两个对象表达共同的基类型。 请看下面的代码:很明显,fb1 和 fb2 应该有一个可能的公共(public)基类型(例如,类似 IFi
我有一个使用参数元组创建类实例的“工厂”: def factory(cls, arg): return cls(*arg) class Foo(object): def __init__(se
我正在编写一个 Duck 类,这样创建的每个 Duck 对象都包含翼展和重量字段变量。每只鸭子都应该随机初始化这些中的每一个。翼展应初始化为 [80.0,100.0]cm 范围内的随机 float 。
我有一些代码可以在我的应用程序中实现音频闪避。当用户正在听一些音乐时,然后进入某个位置,将播放特定的音乐片段。发生这种情况时,正在播放的原始音乐“低声”(或变得更安静),而我的应用程序开始播放的新音乐
如 TypeScript 中所述 handbook : One of TypeScript’s core principles is that type-checking focuses on the
Python 有特定的 ABCs for container types .它说它们是,“……用于测试类是否提供特定接口(interface)。” (而且它们对某些混入也很有用,但我们暂时忽略它。)
问题 我现在已经阅读了很多关于 Duck Typing 的内容,并且我似乎理解了这个概念。 我不明白的是,在什么情况下放弃强类型化编程的好处而转向 Duck Typing 的好处实际上是有意义的。 在
我的文档太多了,因为每当我遇到一个复杂的鸭子类型(duck typing)时,我都需要某种方式来表达“这个鸭子类型(duck typing)”,但却陷入了“你的函数需要这个输入的这个”的无休止循环,但
在 Advantages of Exceptions Java™ 教程的部分: A method can duck any exceptions thrown within it, thereby a
在我目前的工作中,我正在构建一套严重依赖对象的 Perl 脚本。 (在哈希上使用 Perl 的 bless() 以尽可能接近 OO) 现在,由于缺乏更好的表达方式,我公司的大多数程序员都不是很聪明。更
Can I specify interfaces when I declare a member? 在考虑了这个问题一段时间后,我突然想到静态鸭子类型(duck typing)的语言可能真的有效。为什
我对这两个术语有点困惑,这就是我所知道的: 多态性是不同类型的对象由一个公共(public)接口(interface)处理的能力。而鸭子类型(duck typing),是一种动态类型,它允许不同类型的
所有动态语言都支持duck typing ? 我认为 PHP 支持鸭子类型(duck typing)。是这样吗? 最佳答案 任何动态类型的 oop 语言都支持鸭子类型(duck typing),包括
我是一名优秀的程序员,十分优秀!