- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
鉴于this question on Code Review ,灵感来自 this answer on Stack Overflow ,我带着这个问题回到了 Stack Overflow。
假设我有一个包含许多子类的类,比如说 UIControl
。我想用一个方法扩展这个类。此方法应将其相同类型的对象作为其参数之一。但是对于任何和所有这个类的子类,这个方法应该只接受它自己类型的参数。例如,UIButton
应该只接受类型为 UIButton
的参数,而 UILabel
应该只接受类型为 UILabel
的参数。
尝试了什么?
首先:
func foo<T: UIControl>(arg: T) {
// do stuff
}
就编译和运行而言,这是有效的,但它不强制执行。我可以传递任何 UIControl
子类,无论我实际调用什么类型的 foo
。
下一步:
func foo(arg: Self) {
// do stuff
}
还有:
func foo<T: Self>(arg: T) {
// do stuff
}
这些都不起作用,但这是一个想法。不编译,不能像这样使用 Self
。
还试过:
func foo(arg: self.dynamicType) {
// do stuff
}
和:
func foo(arg: typeof(self)) {
// do stuff
}
而且这些仍然没有一个有效——无法编译(这些错误很奇怪而且合理...)。
然后:我没有想法了。
现在,一般来说,我们可能会争辩说使用泛型很好,因为我们只打算用它做我们将泛型约束到的父对象能够做的事情,但是如果我们想返回这个对象怎么办其他人会知道并需要它作为比我们定义的父类型更具体的东西?
例如,如果我们正在编写一个函数来添加回调:
func doCallBack<T: UIControl>(callback: (T) -> Void)) {
callback(self)
}
在回调 block 中,用户能够使用和引用参数作为其特定类型对我们来说很重要,但对我们来说,当我们调用 doCallBack
UIButton
,T
的类型只能是一个UIButton
,但是当我们在一个上调用
,doCallBack
UILabelT
的类型只能是一个UILabel
,对于每种类型的UIControl
等等。
这完全可以实现吗?
最佳答案
But for any and all of this classes subclasses, this method should only accept an argument of its own type.
这对于继承的工作方式来说是不可能的。
考虑
class Foo : UIControl
class Bar : Foo
所以 Foo
必须有一个带有签名的方法 func foo(arg: Foo)
。由于 Bar
是 Foo
的子类,它将继承一个带有签名的方法 func foo(arg: Foo)
(或者用一个该签名的方法)。在任何情况下,参数类型都不能比 Foo
窄,因为这样 Bar
就不能像继承要求的那样适本地替代 Foo
.因此,Bar
的foo
方法不能“只接受它自己类型的参数”。
关于generics - 如何接受一个不太通用但动态的类型作为子类的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27434346/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!