| /* |
| * Copyright 2000-2010 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| import java.io.*; |
| class Test { |
| interface InterfA { |
| <T extends Cloneable & Iterable> void foo(T x); |
| |
| <T extends Iterable & Cloneable> void foo(T x); |
| } |
| |
| class ANotSame { |
| <T extends Cloneable & Iterable> void foo(T x){} |
| |
| <T extends Iterable & Cloneable> void foo(T x){} |
| } |
| |
| class BNotSame extends ANotSame { |
| @Override |
| <T extends Cloneable & Iterable> void foo(T x){} |
| } |
| |
| abstract class A<T extends Throwable> { |
| abstract <T extends Comparable<?> & Serializable> void foo(T x, A<?> y); |
| |
| abstract <T extends Serializable & Comparable<?>> void foo(T x, A<? extends Cloneable> y); |
| } |
| |
| /* abstract class B<T extends Throwable> { |
| abstract <T extends Comparable<?> & Serializable> void foo(T x, B<?> y); |
| |
| abstract <T extends Serializable & Comparable<?>> void foo(T x, B<? extends Throwable> y); |
| } |
| |
| |
| abstract class C<T extends Throwable & Serializable> { |
| abstract <T extends Comparable<?> & Serializable> void foo(T x, C<? extends Serializable> y); |
| |
| abstract <T extends Serializable & Comparable<?>> void foo(T x, C<? extends Throwable> y); |
| }*/ |
| |
| abstract class D<T extends Throwable & Runnable> { |
| <error descr="'foo(T, D<? extends Runnable>)' clashes with 'foo(T, D<? extends Throwable>)'; both methods have same erasure">abstract <T extends Serializable & Comparable<?>> void foo(T x, D<? extends Runnable> y)</error>; |
| |
| abstract <T extends Serializable & Comparable<?>> void foo(T x, D<? extends Throwable> y); |
| } |
| |
| |
| interface IA {} |
| interface IB {} |
| void testExtendsOrder() { |
| class E<T extends IA & IB> { |
| <error descr="'foo(E<? extends IA>)' clashes with 'foo(E<? extends IB>)'; both methods have same erasure">void foo(E<? extends IA> x)</error> {} |
| void foo(E<? extends IB> x) {} |
| } |
| } |
| |
| abstract class F<T extends Throwable> { |
| <error descr="'foo(F<?>)' is already defined in 'Test.F'">abstract void foo(F<?> y)</error>; |
| |
| <error descr="'foo(F<? extends Throwable>)' is already defined in 'Test.F'">abstract void foo(F<? extends Throwable> y)</error>; |
| } |
| } |
| |
| class Ao {} |
| |
| class Bo extends Ao {} |
| |
| class SettingsEditor<T> { |
| } |
| |
| abstract class RunConfigurationExtension<T extends Ao> { |
| protected abstract <P extends T> SettingsEditor<P> createEditor(final P configuration); |
| } |
| |
| class F extends RunConfigurationExtension<Bo> { |
| |
| @Override |
| protected <P extends Bo> SettingsEditor<P> createEditor(P configuration) { |
| return null; |
| } |
| } |