具有继承错误的泛型
Generics with inheritance error
我有 2 个对象继承自同一个对象。
还有一个进一步类型的通用对象。
我想保存通用对象列表,但出现错误。
//Error: Cannot convert value of Type Node to expected argument type Node
代码:
class Pet {
}
class Cat: Pet {
}
class Dog: Pet {
}
public class Node<T> {
public var value: T
public init(value: T) {
self.value = value
}
}
var list = [Node<Pet>]()
//Error: Cannot convert value of Type Node<Dog> to expected argument type Node<Pet>
list.append(Node<Dog>(value: Dog()))
为什么会这样?有什么建议吗?
编辑:
如果 Dog 是 Kind Pet 为什么我不能创建节点列表
并向其添加一个节点?
Swift 对类型很严格。当需要 Node<Pet>
时,您不能附加 Node<Dog>
。
你可以自己选择转换成需要的类型Dog() as Pet
:
list.append(Node(value: Dog()))
// or
list.append(Node<Pet>(value: Dog()))
// or
list.append(Node<Pet>(value: Dog() as Pet))
后面如果需要访问对象并获取正确的类型,就得向下转型了:
if let myDog = list[0].value as? Dog {
print("woff woff")
}
参见working demo。
阅读有关 type casting 的更多详细信息。
如果你有这样的基础:
class Pet { }
class Cat: Pet { }
class Dog: Pet { }
class Tiger: Cat { }
public class Node<T> {
public var value: T
public init(value: T) { self.value = value }
}
那么你可以这样做:
var list = [Node<Pet>]()
list.append(Node(value: Dog()))
list.append(Node(value: Cat()))
list.append(Node(value: Tiger()))
我有 2 个对象继承自同一个对象。 还有一个进一步类型的通用对象。 我想保存通用对象列表,但出现错误。
//Error: Cannot convert value of Type Node to expected argument type Node
代码:
class Pet {
}
class Cat: Pet {
}
class Dog: Pet {
}
public class Node<T> {
public var value: T
public init(value: T) {
self.value = value
}
}
var list = [Node<Pet>]()
//Error: Cannot convert value of Type Node<Dog> to expected argument type Node<Pet>
list.append(Node<Dog>(value: Dog()))
为什么会这样?有什么建议吗?
编辑:
如果 Dog 是 Kind Pet 为什么我不能创建节点列表 并向其添加一个节点?
Swift 对类型很严格。当需要 Node<Pet>
时,您不能附加 Node<Dog>
。
你可以自己选择转换成需要的类型Dog() as Pet
:
list.append(Node(value: Dog()))
// or
list.append(Node<Pet>(value: Dog()))
// or
list.append(Node<Pet>(value: Dog() as Pet))
后面如果需要访问对象并获取正确的类型,就得向下转型了:
if let myDog = list[0].value as? Dog {
print("woff woff")
}
参见working demo。
阅读有关 type casting 的更多详细信息。
如果你有这样的基础:
class Pet { }
class Cat: Pet { }
class Dog: Pet { }
class Tiger: Cat { }
public class Node<T> {
public var value: T
public init(value: T) { self.value = value }
}
那么你可以这样做:
var list = [Node<Pet>]()
list.append(Node(value: Dog()))
list.append(Node(value: Cat()))
list.append(Node(value: Tiger()))