无法解析“ImmutableList”中的“of”方法

Tom*_*omV 13 java android android-billing

调试详细信息:按照从 Android Billing 4.0 迁移到 5.0 的教程https://developer.android.com/google/play/billing/migrate-gpblv5,特别是“显示可供购买的产品”部分 ImmutableList 中的“of”被标记为红色,Android Studio 中的错误是

无法解析“ImmutableList”中的“of”方法”

我该如何解决?

获得编译错误的最小可重现代码:

QueryProductDetailsParams queryProductDetailsParams =
        QueryProductDetailsParams.newBuilder()
                .setProductList(
                        ImmutableList.of(
                                QueryProductDetailsParams.Product.newBuilder()
                                        .setProductId(PREMIUM_MONTHLY_VERSION_ID)
                                        .setProductType(BillingClient.ProductType.SUBS)
                                        .build()))
                .build();
Run Code Online (Sandbox Code Playgroud)

以下是具体细节:

期望的行为:代码编译良好。

具体问题或错误:编译错误。

rzw*_*oot 17

ImmutableList在“Android Billing 5.0 教程”的上下文中,显然是指 guava 的 ImmutableList - 这种类型的全名是com.google.common.collect.ImmutableList.

据我所知,这个类被嵌入到 android 中(但不是纯 java 中的)。一直以来都是有of方法的。因此:

  • 您的包或源文件中很可能有某种名为ImmutableList. 不要那样做。将您的重命名为其他名称。
  • 或者,检查您的导入 - 您导入了其他也名为ImmutableList. 您应该import com.google.common.collect.ImmutableList;在顶部有一个,或者可能import com.google.common.collect.*;- 如果缺少,请考虑添加它。

Android 没有“有”java 9 或 java 11 - 你只需要 java1 即可,重点是:它根本不是 java 核心类- 只有以 is 开头的东西java.*。然而,android 并不(完全)是 java

我只是不确定:我认为 guava (包含 ImmutableList 的库)默认在 android 上可用,这意味着你的 IDE 设置已损坏。或者也许不是,在这种情况下你需要添加 'guava ' 依赖。怎么样?嗯,这取决于 - 我认为 android 构建是基于 gradle 的,这意味着:在 search.maven.org 上查找它并按照 gradle 说明进行操作。

  • 已解决:需要在 build.gradle 依赖项中添加实现“com.google.guava:guava:24.1-jre”。感谢 Michael、Hovercraft Full of Eels 和 @rzwitserloot 引领我走上正确的道路! (16认同)
  • 'com.google.guava:guava:24.1-jre' 可能会在构建时导致重复类问题,因此最好将其添加到您的 gradle 中:implementation 'com.google.guava:guava:27.0.1-android' //对于计费 (15认同)
  • 导入 com.google.firebase.crashlytics.buildtools.reloc.com.google.common.collect.ImmutableList;实施 'com.google.firebase:firebase-crashlytics-buildtools:2.9.1' 会起作用。 (2认同)