Как объяснить этот код в методе resolGetterConflicts () в mybatis?почему логическое значение отличается от других классов? - PullRequest
0 голосов
/ 15 декабря 2018
private void resolveGetterConflicts(Map<String, List<Method>> conflictingGetters) {
for (Entry<String, List<Method>> entry : conflictingGetters.entrySet()) {
  Method winner = null;
  String propName = entry.getKey();
  for (Method candidate : entry.getValue()) {
    if (winner == null) {
      winner = candidate;
      continue;
    }
    Class<?> winnerType = winner.getReturnType();
    Class<?> candidateType = candidate.getReturnType();
    if (candidateType.equals(winnerType)) {
      if (!boolean.class.equals(candidateType)) {
        throw new ReflectionException(
            "Illegal overloaded getter method with ambiguous type for property "
                + propName + " in class " + winner.getDeclaringClass()
                + ". This breaks the JavaBeans specification and can cause unpredictable results.");
      } else if (candidate.getName().startsWith("is")) {
        winner = candidate;
      }
    } else if (candidateType.isAssignableFrom(winnerType)) {
      // OK getter type is descendant
    } else if (winnerType.isAssignableFrom(candidateType)) {
      winner = candidate;
    } else {
      throw new ReflectionException(
          "Illegal overloaded getter method with ambiguous type for property "
              + propName + " in class " + winner.getDeclaringClass()
              + ". This breaks the JavaBeans specification and can cause unpredictable results.");
    }
  }
  addGetMethod(propName, winner);
}
}

По моему мнению, переопределенный метод в подклассе может возвращать подтип типа, возвращенного переопределенным методом в суперклассе, метод obove может разрешить этот случай.

Но я очень запутался с этим кодом в методе:

      if (!boolean.class.equals(candidateType)) {
        throw new ReflectionException(
            "Illegal overloaded getter method with ambiguous type for property "
                + propName + " in class " + winner.getDeclaringClass()
                + ". This breaks the JavaBeans specification and can cause unpredictable results.");
      } else if (candidate.getName().startsWith("is")) {
        winner = candidate;
      }

`` `

Почему логическое значение отличается от других классов? Может кто-нибудь может мне помочь?спасибо !!

1 Ответ

0 голосов
/ 15 декабря 2018

ОК, потому что JavaBean Spec позволяет:

public boolean isBool() {return true;}
public boolean getBool() {return false;}
...