2017-04-18 78 views
0

我在上SCALA的性状如下代码,类型,矢量和密封类的Scala

trait example { 
    type Schema = Vector[String] //Variable Names 

    sealed abstract class Value; 
    case class URI(name: Node) extends Value 
    case class Literal(value: Node) extends Value 
    case class BlankNode(name: Node) extends Value 
    case class Variable(name: Node) extends Value 

    type Fields = Vector[Value] //vector of values

然后,我填补这一对象使用从阿帕奇耶拿元件访问者在其他类如下:

class interpreter (q:Query) extends SPARQLInterpreter { 
    //val Fields = Vector[Value] 
    ElementWalker.walk(q.getQueryPattern(), 

    new ElementVisitorBase() { 

     override def visit(el: ElementPathBlock) { 

     val triples: util.Iterator[TriplePath] = el.patternElts 
     while (triples.hasNext()) { 
      val aux1: Triple = triples.next().asTriple() 
      val u:Value = URI(aux1.getSubject()) 
      val b:Value = BlankNode(aux1.getPredicate) 
      val l:Value = Literal(aux1.getObject()) 
     } 
     } 
    }) 

然后,我的问题是我应该如何填充Fields类型的声明,如Fields(u,b,l),因为它是一个向量,但编译器检测到错误。

回答

1

你不能写Fields(u,b,l)因为没有对象Fields

你可以做的是val fields: Fields = Vector(u, b, l)它创建了一个值名称的字段类型为矢量[值]和分配什么东西。

type用于创建仅影响类型名称的类型别名。 type Fields = Vector[Value]Vector[Value]创建了一个新名称,FieldsVector[Value]现在可以互换使用,因为它们的意思是相同的。

这不会为Vector对象创建一个新名称,因此您无法使用名称字段来引用它。

+0

谢谢,它的工作 –

+0

我只是补充说,你也可以声明'val Fields = Vector'和'type Fields'并且启用'Fields(u,b,l)'等。 –

+0

@AlexeyRomanov非常真实,但是它有一些缺点,例如能够说'Fields(1,2,3,4)'创建一个不符合'Fields'类型的'Vector [Int]',这可能会引起误解。 – puhlen