[我有一个用例,向我的服务器发送一些数据(作为分析),该数据总是String
,Boolean
或Number
。
如何强制调用方只发送数字,布尔值或字符串,而不发送其他任何对象?
以下案例应该起作用-
userProperties: MutableMap<String, in AnyPrimitive> = mutableMapOf(),
userProperties.put("someKey", 1)
userProperties.put("someKey", 1.2f)
userProperties.put("someKey", "someValue")
userProperties.put("someKey", true)
我尝试的方法是创建实现EventData
和CharSequence
的抽象类Number
。但这要求每个人都创建这些类的实例,而不仅仅是发送数字或字符串。
我可以放一个逻辑来检查类型并抛出异常,但我更希望在编译时对其进行限制。
如果要从使用角度简化,请像下面这样声明send函数:
fun send(arg: Any) {
//Validations here:
if (!validate(arg)) throw IllegalArgumentException("...")
//Actual send code here...
}
private fun validate(arg: Any): Boolean {
return (arg is String || arg is Boolean || arg is Number)
}
请注意,这不是在编译时强制执行,而是运行时失败。因此,如果有人编码a
send(RandomObject)
编译将成功。但是在运行时它将失败。