【问题标题】:Weird Android Studio error with Java 8Java 8 出现奇怪的 Android Studio 错误
【发布时间】:2017-10-31 19:02:39
【问题描述】:

我刚刚从 2.3.3 升级到 Android Studio 3.0,并渴望尝试现在支持 pre-API 26 版本的 Java 8 新功能。我在 build.gradle 文件中将 sourceCompatibilitytargetCompatibility 设置为 JavaVersion.VERSION_1_8。然后,不幸的是,我在以下课程中遇到了错误:

package com.zigzagworld.util;

import java.util.LinkedHashMap;

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int maxSize;

    public LRUCache(int maxSize) {
        super(Math.min(16, (int) ((maxSize + 1) / 0.75f)), 0.75f, true);
        this.maxSize = maxSize;
    }

    @Override protected boolean removeEldestEntry(Entry<K, V> eldest) {
        return size() > maxSize;
    }
}

错误是:

Error:(13, 51) 错误:Entry is not public in LinkedHashMap;无法从外部包访问

编辑器本身没有显示任何错误;它只显示为 Gradle 任务 :app:compileDebugJavaWithJavac 的输出。

我使用的是默认工具链。我尝试清理和重建项目。我还尝试使缓存无效并重新启动 Android Studio。

我可以通过将 build.gradle 文件中的语言改回 1.7 来避免该错误。不幸的是,由于我的 minSdkVersion 是 17 岁,因此我将无法使用 try-with-resources 和其他好东西。

有趣的是,我发现我可以通过使用完全限定名称 java.util.Map.Entry 而不是 Entry 来解决该错误。我不知道为什么会这样,而裸名 Entry 会产生错误。

我缺少一些配置设置吗?这是 AS 3.0 中的已知错误吗?

【问题讨论】:

  • 这也不应该在 7 上工作。 LinkedHashMap.Entry 阴影Map.Entry。因此,Map.Entry 不会被 LinkedHashMapLRUCache 的子类继承。您需要限定类型才能使用它。由于Map继承,你可以使用Map.Entry&lt;K, V&gt;
  • @SotiriosDelimanolis - 超类中的私有类是否会影响从父接口继承的类?
  • 继承不会跳过关卡。 LRUCache 仅继承自 LinkedHashMap,其中名为 Entry 的类型不可用。您可以同时拥有LRUCacheimplements Map&lt;K,V&gt; 以使Entry 再次可用。
  • 也许 Android 的 LinkedHashMap 实现在早期版本中没有 Entry 类型。

标签: java android java-8 android-studio-3.0


【解决方案1】:

您必须从条目中获取地图

@Override
 protected boolean removeEldestEntry (Map.Entry<K,V> eldest) {
  return size() > maxSize;
  }

这条线Map.Entry

我们需要从Map接口中获取Entry,因为Entry接口是之前制作的,但是它是在Map接口的最新更新中定义的。 现在我们必须调用 Map 来访问接口或更改包和文件夹导致此

【讨论】:

  • 由于 Sotirios 从未将他的评论作为正确答案发布,因此您因发布该评论而受到赞誉。 :)
猜你喜欢
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2023-03-21
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多