gpt4 book ai didi

控制台中的 Java 消息 - 两种方法具有相同的方法签名但不提供可分配的类?

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:34 24 4
gpt4 key购买 nike

在迁移到 java 1.8 时,我升级了项目中的许多依赖项。它是基于spring 4.3的应用程序,有很多外部依赖,例如:JMS、HTTP客户端、FTP、XMLs等。

当应用程序启动时,我现在在控制台中收到以下消息:

Two methods with same method signature but not providing classes assignable? "public final int java.util.concurrent.ConcurrentHashMap$CollectionView.size()" and "public abstract int java.util.Set.size()" please report!

知道此错误消息是什么以及如何查找导致问题的 jar 吗?

我还可以通过任何方式在控制台上打印一些关于哪个类/线程/堆栈正在打印此错误的额外数据。

最佳答案

我设法稍微查看了 github 链接提供的代码,并弄清楚了为什么您没有获得堆栈跟踪。它不会抛出异常。

来源:https://github.com/jkuhnert/ognl/blob/master/src/java/ognl/OgnlRuntime.java

private static MatchingMethod findBestMethod(List methods, Class typeClass, String name, Class[] argClasses) {
MatchingMethod mm = null;
IllegalArgumentException failure = null;
for (int i = 0, icount = methods.size(); i < icount; i++) {
// ...

if (mm == null || mm.score > score) {
mm = new MatchingMethod(m, score, report, mParameterTypes);
failure = null;
} else if (mm.score == score) {
if (Arrays.equals(mm.mMethod.getParameterTypes(), m.getParameterTypes()) && mm.mMethod.getName().equals(m.getName())) {
if (mm.mMethod.getDeclaringClass().isAssignableFrom(m.getDeclaringClass())) {
if (!retsAreEqual && !mm.mMethod.getReturnType().isAssignableFrom(m.getReturnType()))
System.err.println("Two methods with same method signature but return types conflict? \""+mm.mMethod+"\" and \""+m+"\" please report!");

mm = new MatchingMethod(m, score, report, mParameterTypes);
failure = null;
} else if (!m.getDeclaringClass().isAssignableFrom(mm.mMethod.getDeclaringClass())) {
// this should't happen
System.err.println("Two methods with same method signature but not providing classes assignable? \""+mm.mMethod+"\" and \""+m+"\" please report!");
} else if (!retsAreEqual && !m.getReturnType().isAssignableFrom(mm.mMethod.getReturnType()))
System.err.println("Two methods with same method signature but return types conflict? \""+mm.mMethod+"\" and \""+m+"\" please report!");
} else {
// ... cut out
}
}
}
if (failure != null)
throw failure;
return mm;
}

我在它周围删掉了一堆代码。您的代码在字面上有注释声明这不应该发生的地方失败。

糟糕。

无论如何,它不会导致失败,因为它实际上并没有为 failure 分配任何东西,如果它在其他地方失败了,它会抛出一个实际的堆栈跟踪。

我不知道为什么会触发此语句,因为我不是反射(reflection)方面的专家。

!m.getDeclaringClass().isAssignableFrom(mm.mMethod.getDeclaringClass())

但是,它只是跳过并继续执行 for 循环,而不添加异常或执行任何其他操作。我假设它保留第一个参数的内容并继续评估。

如果您仍然怀疑,请使用 Maven 将依赖关系树映射到该库,看看是否有更新的版本不会破坏一切。

关于控制台中的 Java 消息 - 两种方法具有相同的方法签名但不提供可分配的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41621484/

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