gpt4 book ai didi

scala - 从Scala代码使用Google Guava 时出现编译器错误

转载 作者:行者123 更新时间:2023-12-02 10:41:05 25 4
gpt4 key购买 nike

我正在使用Scala代码中的Google Guava。当我尝试将Int用作示例中的键类型时,会发生问题:

CacheBuilder.newBuilder()
.maximumSize(2)
.expireAfterWrite(24, TimeUnit.HOURS)
.build(
new CacheLoader[Int, String] {
def load(path: Int): String = {
path + "hello"
}
}
)

看起来不错,但是推断出的创建对象的类型是 LoadingCache [Int with AnyRef,String] :
  val cache: LoadingCache[Int with AnyRef, String] = CacheBuilder.newBuilder()
.maximumSize(2)
.expireAfterWrite(24, TimeUnit.HOURS)
.build(
new CacheLoader[Int, String] {
def load(path: Int): String = {
path + "hello"
}
}
)

当我尝试获取此示例中的元素时,就会发生错误:
cache.get(1)

Scala编译器错误:
[ERROR] error: type mismatch;
[INFO] found : Int(1)
[INFO] required: Int
[INFO] cache.get(1)
[INFO] ^

有人可以指出为什么出现这种错误以及我在做什么错吗?

ENV:
  • Google Guava 15.0
  • Scala 2.11.5
  • 最佳答案

    1上不是Int with AnyRef您问题中的编译错误与 Guava 无关。此代码段在此处产生相同的错误:

    val h = new scala.collection.mutable.HashMap[Int with AnyRef, String]
    h(3) = "hello"
    println("Get 3: " + h.get(3))
    error: type mismatch;
    found : Int(3)
    required: Int
    这是由 Int with AnyRef引起的:由于 IntAnyVal的子类型,所以交集 Int with AnyRef为空,因此根本不存在具有该类型的任何实例。

    现在是问题的根本原因。
    问题在于,当您调用 .build()时,scala编译器无法找到可以用作 .build[Int, String]的版本,因为没有针对未装箱整数的版本。因此,编译器会推断 .build[AnyRef with Int, String],并构建一个无法使用的缓存结构。
    为避免这种情况,请使用 java.lang.Integer而不是 Int。这是在guava 15.0 scala 2.11上编译和运行的:
    import com.google.common.cache._
    import java.util.concurrent._

    val cache: LoadingCache[java.lang.Integer, String] = CacheBuilder.newBuilder()
    .maximumSize(2)
    .expireAfterWrite(24, TimeUnit.HOURS)
    .build[java.lang.Integer, String](
    new CacheLoader[java.lang.Integer, String] {
    def load(path: java.lang.Integer): String = {
    path + "hello"
    }
    }
    )

    cache.put(42, "hello, world")
    println(cache.get(42))
    它应该可以与scala的 Int无缝运行,因为无论如何,scala都会自动将 Int装箱到 java.lang.Integer中。

    针对类似错误的答案:
  • Scala Guava type mismatch issue
  • 关于scala - 从Scala代码使用Google Guava 时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48892516/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com