# HG changeset patch # User mcimadamore # Date 1291909810 0 # Node ID de2a86da165ec31f59129ecff6bf062e37990bda # Parent 6133f51d8f7dc5678f340d1359fdae418c60a410 7005095: Cast: compile reject sensible cast from final class to interface Summary: a previous fix to cast conversion has made the compiler too strict w.r.t. final cast Reviewed-by: jjg diff -r 6133f51d8f7d -r de2a86da165e langtools/src/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Wed Dec 08 21:21:42 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Dec 09 15:50:10 2010 +0000 @@ -1033,12 +1033,7 @@ && !disjointTypes(aHigh.allparams(), lowSub.allparams()) && !disjointTypes(aLow.allparams(), highSub.allparams()) && !disjointTypes(aLow.allparams(), lowSub.allparams())) { - if (s.isInterface() && - !t.isInterface() && - t.isFinal() && - !isSubtype(t, s)) { - return false; - } else if (upcast ? giveWarning(a, b) : + if (upcast ? giveWarning(a, b) : giveWarning(b, a)) warnStack.head.warnUnchecked(); return true; @@ -3377,8 +3372,8 @@ public Type visitCapturedType(CapturedType t, Void s) { Type bound = visitWildcardType(t.wildcard, null); return (bound.contains(t)) ? - (high ? syms.objectType : syms.botType) : - bound; + erasure(bound) : + bound; } @Override @@ -3386,7 +3381,7 @@ if (rewriteTypeVars) { Type bound = high ? (t.bound.contains(t) ? - syms.objectType : + erasure(t.bound) : visit(t.bound)) : syms.botType; return rewriteAsWildcardType(bound, t); diff -r 6133f51d8f7d -r de2a86da165e langtools/test/tools/javac/cast/7005095/T7005095neg.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/cast/7005095/T7005095neg.java Thu Dec 09 15:50:10 2010 +0000 @@ -0,0 +1,14 @@ +/* + * @test /nodynamiccopyright/ + * @bug 7005095 + * @summary Cast: compile reject sensible cast from final class to interface + * @compile/fail/ref=T7005095neg.out -XDrawDiagnostics T7005095neg.java + */ + +class T7005095pos { + interface Foo {} + + static final class FooImpl implements Foo {} + + Object o = (Foo) new FooImpl(); +} diff -r 6133f51d8f7d -r de2a86da165e langtools/test/tools/javac/cast/7005095/T7005095neg.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/cast/7005095/T7005095neg.out Thu Dec 09 15:50:10 2010 +0000 @@ -0,0 +1,2 @@ +T7005095neg.java:13:25: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), T7005095pos.FooImpl, T7005095pos.Foo +1 error diff -r 6133f51d8f7d -r de2a86da165e langtools/test/tools/javac/cast/7005095/T7005095pos.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/cast/7005095/T7005095pos.java Thu Dec 09 15:50:10 2010 +0000 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2010, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7005095 + * @summary Cast: compile reject sensible cast from final class to interface + * @compile T7005095pos.java + */ + +class T7005095pos { + interface Foo {} + + static final class FooImpl implements Foo {} + + Object o = (Foo) new FooImpl(); +}