--- old/src/java.base/share/classes/java/lang/reflect/Executable.java 2018-10-11 17:46:32.772000000 -0700 +++ new/src/java.base/share/classes/java/lang/reflect/Executable.java 2018-10-11 17:46:32.600000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -135,6 +135,19 @@ */ abstract void specificToStringHeader(StringBuilder sb); + String typeVarBounds(TypeVariable typeVar) { + Type[] bounds = typeVar.getBounds(); + if (bounds.length == 1 && bounds[0].equals(Object.class)) { + return typeVar.getName(); + } else { + StringJoiner sj = new StringJoiner(" & "); + for (Type bound : bounds) { + sj.add(bound.getTypeName()); + } + return typeVar.getName() + " extends " + sj.toString(); + } + } + String sharedToGenericString(int modifierMask, boolean isDefault) { try { StringBuilder sb = new StringBuilder(); @@ -145,7 +158,7 @@ if (typeparms.length > 0) { StringJoiner sj = new StringJoiner(",", "<", "> "); for(TypeVariable typeparm: typeparms) { - sj.add(typeparm.getTypeName()); + sj.add(typeVarBounds(typeparm)); } sb.append(sj.toString()); }