ConCurentHashMap没有keyset()方法,这怎么可能呢?

我正在调试从Matlab调用的Java代码,并获得异常:

Java exception occurred:
java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;

库类没有库方法,怎么可能?

更新

Matlab正在使用Java7。我调用的代码是为Java8编译的,包含语法

for (Tag t : matrix.keySet()) {

Java8-特定。虽然声称它应该与Java7是二进制兼容的,否则在Java8中做许多妥协是没有意义的。


解决方案

在JAVA 8中,ConcurrentHashMap.keySet()返回类型已更改。 在Oracle JDK 7中:

public Set<K> keySet() {
    Set<K> ks = keySet;
    return (ks != null) ? ks : (keySet = new KeySet());
}

在Oracle JDK 8中:

public KeySetView<K,V> keySet() {
    KeySetView<K,V> ks;
    return (ks = keySet) != null ? ks : (keySet = new KeySetView<K,V>(this, null));
}

public static class KeySetView<K,V> extends CollectionView<K,V,K>
    implements Set<K>, java.io.Serializable {

相关文章