假设A
是抽象类型,我有一个函数f{T<:A}(x::Vector{A})
。因此x
可以是Vector{A}
类型,也可以是Vector{B}
B <: A
。在函数的中间我想将x
强制转换为Vector{A}
,以便它可以被另一个需要签名的函数使用。
最好的方法是什么?目前我在做x = collect(A, x)
。有可能避免复制吗?
答案 0 :(得分:4)
如果可能,我只是将您的第二个功能定义更改为参数,如f
。在方法签名中实施这种容器结构是一个很大的性能错误,它不能为您带来任何功能......并且只是使它们更难以使用。
也就是说,进行这种转换的最佳方式是,如果输出别名输入,请关注convert(Vector{A}, x)
。如果x
已经是Vector{A}
,那么这将是一个无操作,但除此之外它就像collect
。这很好。
原因如下:两个Vector{A}
和Vector{B}
类型的容器如果A !== B
无法共享相同的内存,因为它可能损坏Vector{B}
中的数据,方法是通过B
将非Vector{A}
元素分配给数组。