仓颉编程语言的Any 类型(Any 接口)
仓颉编程语言的Any 类型(Any 接口)
Any 类型是一个内置的接口,仓颉中所有接口都默认继承它,所有非接口类型都默认实现它,因此所有类型都可以作为 Any 类型的子类型使用。这意味着不需要程序员自己写interface Any {}。
目前Any类型,必须先通过模式匹配将其转换为具体类型,然后再打印。
注意,仓颉语言目前不能直接使用println(anyObj) 打印输出,因为对Any类型仓颉语言未提相关机制。
例如如下代码是
main() {
var any: Any = 1
//pringln(any) //行不通
Any = 2.0
//pringln(any) //行不通
Any = "hello, world!"
//pringln(any) //行不通
}
应写为(推荐方案):
func printAny(value: Any) {match (value) {case i: Int64 => println(i)case f: Float64 => println(f)case s: String => println(s)case b: Bool => println(b)case _ => println("unknown type")}
}main() {var any: Any = 1printAny(any) // 输出: 1any = 2.0printAny(any) // 输出: 2.000000any = "hello, world!"printAny(any) // 输出: hello, world!
}
运行截图:
或写为:
func anyToString(value: Any): String {match (value) {case i: Int64 => return i.toString()case f: Float64 => return f.toString()case s: String => return scase b: Bool => return b.toString()case _ => return "unknown"}
}main() {var any: Any = 1println("Value: ${anyToString(any)}") // 输出: Value: 1any = 2.0println("Value: ${anyToString(any)}") // 输出: Value: 2.000000 any = "hello, world!"println("Value: ${anyToString(any)}") // 输出: Value: hello, world!
}
Any 接口综合示例源码
较全面展示了Any接口在类型处理、容器存储和类型检查等方面的应用场景。
// Any 接口综合示例
package demo10import std.math.sqrt // sqrt
import std.collection.ArrayList // 使用 ArrayList
// 定义不同的类型
class Person {let name: Stringlet age: Intinit(name: String, age: Int) {this.name = namethis.age = age}public func toString(): String {return "Person(name: ${name}, age: ${age})"}
}struct Point {let x: Float64let y: Float64init (x: Float64, y: Float64){this.x = xthis.y = y }public func toString(): String {return "Point(x: ${x}, y: ${y})"}
}enum Status {| Active| Inactive| Pendingpublic func toString(): String {match (this) {case Status.Active => return "Active"case Status.Inactive => return "Inactive"case Status.Pending => return "Pending"}}
}// 通用的打印函数,接受任意类型
func printValue(value: Any) {println("Value type: ") //${value.getClass().getName()}// 使用模式匹配进行类型判断match (value) {case i: Int64 => println(" Integer: ${i}")println(" Double value: ${i * 2}")case f: Float64 => println(" Float: ${f}")println(" Squared: ${f * f}")case s: String => println(" String: '${s}'")println(" Length: ${s.size}")case p: Person => println(" ${p.toString()}")println(" Is adult: ${p.age >= 18}")case pt: Point => println(" ${pt.toString()}")println(" Distance from origin: ${sqrt((pt.x * pt.x + pt.y * pt.y))}")case st: Status =>let message = match (st) {case Status.Active => "System is running"case Status.Inactive => "System is stopped"case Status.Pending => "System is waiting"}println(" Message: ${message}")case t: (Int64, Int64) => println(" Tuple: (${t[0]}, ${t[1]})")println(" Sum: ${t[0] + t[1]}")case _ => println(" Unknown type")}println("---")
}// 异构容器示例。这个有问题,解决见下面
// class Container {
// private var items: Array<Any> = Array<Any>() // public func add(item: Any) {
// items.append(item)
// }// public func getAll(): Array<Any> {
// return items
// }// public func printAll() {
// println("Container has ${items.size} items:")
// for (i in 0..items.size) {// println(" [${i}]: ${items[i]}") //报错!!!
// }
// }
// }// 异构容器示例
class Container {private var items: ArrayList<Any> = ArrayList<Any>()public func add(item: Any) {items.add(item)}public func getAll(): ArrayList<Any> {return items}public func printAll() {println("Container has ${items.size} items:")for (i in 0..items.size) { // 避免越界let itemStr = anyToString(items[i]) // ?!println(" [${i}]: ${itemStr}")}}}// 全局函数,将 Any 转换为字符串
func anyToString(value: Any): String {match (value) {case i: Int64 => return i.toString()case f: Float64 => return f.toString()case s: String => return scase b: Bool => return if (b) { "true" } else { "false" }case p: Person => return p.toString() // 处理 Person 类型case pt: Point => return pt.toString() // 处理 Point 类型case st: Status => return st.toString() // 处理 Status 枚举case _ => return "unknown type"}
}// 通用的比较函数
func compareAny(a: Any, b: Any): Bool {match ((a, b)) {case (x: Int64, y: Int64) => return x == ycase (x: Float64, y: Float64) => return x == ycase (x: String, y: String) => return x == ycase (x: Bool, y: Bool) => return x == ycase _ => return false}
}main() {println("=== Any Interface Demo ===\n")// 1. 基本类型作为 Anyprintln("1. Basic types as Any:")var anyVar: Any = 42printValue(anyVar)anyVar = 3.14159printValue(anyVar)anyVar = "Hello, Cangjie!"printValue(anyVar)// 2. 自定义类型作为 Anyprintln("\n2. Custom types as Any:")anyVar = Person("Alice", 25)printValue(anyVar)anyVar = Point(3.0, 4.0)printValue(anyVar)anyVar = Status.ActiveprintValue(anyVar)// 3. 元组作为 Anyprintln("\n3. Tuple as Any:")anyVar = (10, 20)printValue(anyVar)// 4. 异构容器示例println("\n4. Heterogeneous container:")let container = Container()container.add(100)container.add("Cangjie")container.add(Person("Bob", 30))container.add(Point(1.0, 2.0))container.add(true)container.add(Status.Active)container.printAll() // 打印所有项// 5. Any 类型的比较println("\n5. Comparing Any values:")let a1: Any = 42let a2: Any = 42let a3: Any = "42"println("42 == 42: ${compareAny(a1, a2)}")println("42 == '42': ${compareAny(a1, a3)}")// 6. Any 数组的处理println("\n6. Processing Any array:")let mixedArray: Array<Any> = [1, 2.5, "three", Person("Charlie", 35),Point(5.0, 12.0),Status.Pending]println("Mixed array contains ${mixedArray.size} elements")// 统计不同类型的数量var intCount = 0var floatCount = 0var stringCount = 0var otherCount = 0for (item in mixedArray) {match (item) {case _: Int64 => intCount++case _: Float64 => floatCount++case _: String => stringCount++case _ => otherCount++}}println("Type statistics:")println(" Integers: ${intCount}")println(" Floats: ${floatCount}")println(" Strings: ${stringCount}")println(" Others: ${otherCount}")return 0
}
运行输出:
=== Any Interface Demo ===
1. Basic types as Any:
Value type:
Integer: 42
Double value: 84
---
Value type:
Float: 3.141590
Squared: 9.869588
---
Value type:
String: 'Hello, Cangjie!'
Length: 15
---
2. Custom types as Any:
Value type:
Person(name: Alice, age: 25)
Is adult: true
---
Value type:
Point(x: 3.000000, y: 4.000000)
Distance from origin: 5.000000
---
Value type:
Message: System is running
---
3. Tuple as Any:
Value type:
Tuple: (10, 20)
Sum: 30
---
4. Heterogeneous container:
Container has 6 items:
[0]: 100
[1]: Cangjie
[2]: Person(name: Bob, age: 30)
[3]: Point(x: 1.000000, y: 2.000000)
[4]: true
[5]: Active
5. Comparing Any values:
42 == 42: true
42 == '42': false
6. Processing Any array:
Mixed array contains 6 elements
Type statistics:
Integers: 1
Floats: 1
Strings: 1
Others: 3
附录、官方相关文档https://cangjie-lang.cn/docs?url=%2F1.0.0%2Fuser_manual%2Fsource_zh_cn%2Fclass_and_interface%2Finterface.html