blob: cabf948d0413ba6998c8226c9bf0abada2de3672 [file] [log] [blame]
/*
* 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;
}
}