【发布时间】:2017-10-31 19:02:39
【问题描述】:
我刚刚从 2.3.3 升级到 Android Studio 3.0,并渴望尝试现在支持 pre-API 26 版本的 Java 8 新功能。我在 build.gradle 文件中将 sourceCompatibility 和 targetCompatibility 设置为 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不会被LinkedHashMap、LRUCache的子类继承。您需要限定类型才能使用它。由于Map被继承,你可以使用Map.Entry<K, V>。 -
@SotiriosDelimanolis - 超类中的私有类是否会影响从父接口继承的类?
-
继承不会跳过关卡。
LRUCache仅继承自LinkedHashMap,其中名为Entry的类型不可用。您可以同时拥有LRUCache和implements Map<K,V>以使Entry再次可用。 -
也许 Android 的
LinkedHashMap实现在早期版本中没有Entry类型。
标签: java android java-8 android-studio-3.0