我正在尝试在我创建的两种复合类型之间建立联盟:
type point
x::Int8
y::Int8
end
type vector
x::Int8
y::Int8
end
VecOrPoint = Union{point,vector}
x = point(Int8(2),Int8(3))
y = vector(Int8(2),Int8(3))
function sum(u::VecOrPoint,v::VecOrPoint)
return VecOrPoint(u.x + v.x,u.y + v.y) # ERROR HERE
end
z = sum(x,y)
我得到了以下错误:
ERROR: LoadError: MethodError: `convert` has no method matching
convert(::Type{Union{point,vector}}, ::Int8, ::Int8)
This may have arisen from a call to the constructor Union{point,vector} (...),
since type constructors fall back to convert methods.
Closest candidates are:
call{T}(::Type{T}, ::Any)
convert{T}(::Type{T}, !Matched::T)
in sum at /home/renatinho/periodoAtual/recsys/testeJulia.jl:17
while loading /home/renatinho/periodoAtual/recsys/testeJulia.jl, in
expression starting on line 20
我已经在谷歌上发了但我找不到任何东西
答案 0 :(得分:3)
来自朱莉娅documentation
类型联合是一种特殊的抽象类型
和here:
抽象类型无法实例化
因此,你想做的事情是不可能的。 (当你在函数中调用VecOrPoint()
时,你正在尝试创建一个实例化,即尝试创建一个类型为你的类型联合的对象。)
我也不太明白你想要做的目的背后的目的。当联盟中的类型不同时,将某些东西“转换”为类型联合是什么意思? (在你给出的例子中,这两种类型是相同的,所以我认为在非常有限的意义上它可能是有可能的,但是如果有两个相同的类型,那么也就没有任何意义,然后将它们结合起来)
如果你想沿着这些方向完成某些事情,你或许可以给自己写一个新的Myconvert()
函数(或者可能重载现有的convert
函数)。在新函数中,您可以对输入执行某些逻辑,并根据该逻辑将其转换为您的一种或另一种类型。然后,您的新功能可以合理地将您的类型联合作为输入。
编辑:或者,正如克里斯在评论中建议的那样,使用类型调度。另请参阅Dan对原始帖子的评论,以获得另一个有用的想法。