### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.compiler Index: src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java,v retrieving revision 1.702 diff -u -r1.702 GenericTypeTest.java --- src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 6 May 2008 08:57:02 -0000 1.702 +++ src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 6 May 2008 10:14:12 -0000 @@ -43743,4 +43743,31 @@ "Unnecessary cast from B to Object\n" + "----------\n"); } +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228291 +public void test1315() { + this.runNegativeTest( + new String[] { + "X.java", + "import java.util.*;\n" + + "\n" + + "public class X extends Vector> {\n" + + " private static final long serialVersionUID = 1L;\n" + + " public Vector cast(List in) {\n" + + " return (Vector) in;\n" + + " }\n" + + " public X castSilly(Vector> in) {\n" + + " return (X) in;\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " Zork z;\n" + + " }\n" + + "}\n", // ================= + }, + "----------\n" + + "1. ERROR in X.java (at line 12)\n" + + " Zork z;\n" + + " ^^^^\n" + + "Zork cannot be resolved to a type\n" + + "----------\n"); +} } \ No newline at end of file #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java,v retrieving revision 1.117 diff -u -r1.117 CastExpression.java --- compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java 6 May 2008 08:57:04 -0000 1.117 +++ compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java 6 May 2008 10:14:13 -0000 @@ -326,39 +326,33 @@ return true; } // [JLS 5.5] S has no subtype X != T, such that |X| == |T| - TypeBinding genericCastType = castType.erasure(); // jump to generic type - TypeBinding genericMatch = genericCastType.findSuperTypeOriginatingFrom(expressionType); - if (genericMatch == match) { + // if I2 extends I1, then cast from I1 to I2 is unchecked + ParameterizedTypeBinding paramCastType = (ParameterizedTypeBinding) castType; + ParameterizedTypeBinding paramMatch = (ParameterizedTypeBinding) match; + // easy case if less parameters on match + TypeBinding[] castArguments = paramCastType.arguments; + int length = castArguments.length; + if (length > paramMatch.arguments.length) { this.bits |= ASTNode.UnsafeCast; - } else { - // if I2 extends I1, then cast from I1 to I2 is unchecked - ParameterizedTypeBinding paramCastType = (ParameterizedTypeBinding) castType; - ParameterizedTypeBinding paramMatch = (ParameterizedTypeBinding) match; - // easy case if less parameters on match - TypeBinding[] castArguments = paramCastType.arguments; - int length = castArguments.length; - if (length > paramMatch.arguments.length) { - this.bits |= ASTNode.UnsafeCast; - } else if ((paramCastType.tagBits & (TagBits.HasDirectWildcard|TagBits.HasTypeVariable)) != 0) { - // verify alternate cast type, substituting different type arguments + } else if ((paramCastType.tagBits & (TagBits.HasDirectWildcard|TagBits.HasTypeVariable)) != 0) { + // verify alternate cast type, substituting different type arguments + nextAlternateArgument: for (int i = 0; i < length; i++) { + switch (castArguments[i].kind()) { + case Binding.WILDCARD_TYPE : + case Binding.TYPE_PARAMETER : + break; // check substituting with other + default: + continue nextAlternateArgument; // no alternative possible + } + TypeBinding[] alternateArguments; + // need to clone for each iteration to avoid env paramtype cache interference + System.arraycopy(paramCastType.arguments, 0, alternateArguments = new TypeBinding[length], 0, length); + alternateArguments[i] = scope.getJavaLangObject(); LookupEnvironment environment = scope.environment(); - nextAlternateArgument: for (int i = 0; i < length; i++) { - switch (castArguments[i].kind()) { - case Binding.WILDCARD_TYPE : - case Binding.TYPE_PARAMETER : - break; // check substituting with other - default: - continue nextAlternateArgument; // no alternative possible - } - TypeBinding[] alternateArguments; - // need to clone for each iteration to avoid env paramtype cache interference - System.arraycopy(paramCastType.arguments, 0, alternateArguments = new TypeBinding[length], 0, length); - alternateArguments[i] = scope.getJavaLangObject(); - ParameterizedTypeBinding alternateCastType = environment.createParameterizedType((ReferenceBinding)genericCastType, alternateArguments, castType.enclosingType()); - if (alternateCastType.findSuperTypeOriginatingFrom(expressionType) == match) { - this.bits |= ASTNode.UnsafeCast; - break; - } + ParameterizedTypeBinding alternateCastType = environment.createParameterizedType((ReferenceBinding)castType.erasure(), alternateArguments, castType.enclosingType()); + if (alternateCastType.findSuperTypeOriginatingFrom(expressionType) == match) { + this.bits |= ASTNode.UnsafeCast; + break; } } }