Как я могу сделать изменяемый. Builder для Java коллекций? - PullRequest
0 голосов
/ 07 апреля 2020

Как видно из названия --- Я начинаю с java .util.List производных типов. (У всех Scala коллекций есть newBuider (), но, конечно, у Java коллекций нет.) У меня пока go:

case class JavaListBuilder[A,To](constructor: Constructor[To]) extends mutable.Builder[A, To] {
  private val internal = mutable.ListBuffer.empty[A]
  def addOne(elem: A): this.type = {
    internal.addOne(elem)
    this
  }
  def clear(): Unit = internal.clear
  def result(): To = constructor.newInstance(internal.result.asJava)
}

def buildTheBuilder[T,TO](t: Class[T], to: Class[TO]): mutable.Builder[T,TO] = {
  val constructor = to.getConstructor(Class.forName("java.util.Collection"))
  JavaListBuilder[T,TO](constructor)
}

val a = java.lang.Integer.valueOf(5)
val t = new java.util.ArrayList[java.lang.Integer]
val jlb = buildTheBuilder(a.getClass, t.getClass)
jlb.addOne(java.lang.Integer.valueOf(1))
jlb.addOne(java.lang.Integer.valueOf(2))
jlb.addOne(java.lang.Integer.valueOf(3))
println(jlb.result)

Это дает мне эту ошибку :

[error] /Users/wmy965/git/sj_blog/src/main/scala/co.blocke.blog/Lab.scala:33:41: type mismatch;
[error]  found   : Integer
[error]  required: T
[error]     jlb.addOne(java.lang.Integer.valueOf(1))

Так что насчет типов это не радует. Есть ли лучший способ выполнить sh то, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 07 апреля 2020

То, что я хотел бы сделать, это просто реализовать построитель, используя классы типов, как они предназначались: путем предоставления конкретной реализации c:

// example
import scala.collection.mutable

class ArrayListBuilder[A] extends mutable.Builder[A, java.util.ArrayList[A]] {
  private val intermediate = mutable.ListBuffer.empty[A]

  override def addOne(elem: A) = {
    intermediate.append(elem)
    this
  }

  override def clear() = {
    intermediate.clear()
  }

  override def result() = {
    val al = new java.util.ArrayList[A](intermediate.size)
    intermediate.foreach { elem =>
      al.add(elem)
    }
    al
  }
}
def arrayListBuilder[A]: ArrayListBuilder[A] = new ArrayListBuilder[A]

val builder = arrayListBuilder[java.lang.Integer]
builder += java.lang.Integer.valueOf(1)
builder += java.lang.Integer.valueOf(2)
builder += java.lang.Integer.valueOf(3)
builder.result

или короче

val builder = arrayListBuilder[java.lang.Integer]
builder += 1
builder += 2
builder += 3
builder.result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...