blob: 19340121a4c7509a2bf069c6ca178113b0153dbb [file] [log] [blame]
import java.util.*;
class Base<T> {
public void method(Base<?> base) { }
public void method1(Base<Base<?>> base) { }
public <V> Base<V> foo() { return null; }
public Base<?> bar() { return null; }
public Base<Base<?>> far() { return null; }
}
class Derived extends Base {
public void method(Base base) { }
public Base foo() { return null; }
public Base bar() { return null; }
}
class Derived1 extends Base {
<error descr="'method1(Base<String>)' in 'Derived1' clashes with 'method1(Base<Base<?>>)' in 'Base'; both methods have same erasure, yet neither overrides the other">public void method1(Base<String> base)</error> { }
public Base<String> far() { return null; } // Acceptable construct as of JDK 1.5 beta 2 may 2004
}
class X <T> {
public <V> void foo () {}
}
class YY extends X {
<error descr="'foo()' in 'YY' clashes with 'foo()' in 'X'; both methods have same erasure, yet neither overrides the other">public <V> void foo()</error> {}
}
interface List<Y> {
public <T> T[] toArray(T[] ts);
}
class AbstractList<Y> {
public <T> T[] toArray(T[] ts) {return null;}
}
//Signatures from List and AbstractList are equal
class ArrayList extends AbstractList implements List {}
//SCR 39485: the following overriding is OK
abstract class Doer {
abstract <X> void go(X x);
}
class MyList <X>
extends Doer {
X x;
<Y> void go(Y y) {}
}
class MyListRaw
extends MyList {
}
//See IDEADEV-1125
//The following two classes are OK
class A1 {
<T> void foo(T t) {}
}
class A2 extends A1 {
void foo(Object o) {}
}
//While these are not
class A3 {
void foo(Object o) {}
}
class A4 extends A3 {
<error descr="'foo(T)' in 'A4' clashes with 'foo(Object)' in 'A3'; both methods have same erasure, yet neither overrides the other"><T> void foo(T t)</error> {}
}
//This sibling override is OK
class A5 {
public void foo(Object o) {}
}
interface I1 {
<T> void foo(T t);
}
class A6 extends A5 implements I1 {}
//While this is not
class A7 {
public <T> void foo(T t) {}
}
interface I2 {
public void foo(Object o);
}
<error descr="Class 'A8' must either be declared abstract or implement abstract method 'foo(Object)' in 'I2'">class A8 extends A7 implements I2</error> {}
//IDEA-9321
abstract class MyMap<K, V> implements java.util.Map<K, V> {
public <error descr="'put(K, V)' in 'MyMap' clashes with 'put(K, V)' in 'java.util.Map'; attempting to use incompatible return type">Object</error> put(K key, V value) {
return null;
}
}
//end of IDEA-9321
abstract class AA <T> {
abstract void foo(T t);
}
abstract class BB<T> extends AA<BB> {
void foo(BB b) {}
}
class CC extends BB {
//foo is correctly seen from BB
}
class QQQ {}
abstract class GrandParent<T> {
public abstract void paint(T object);
}
class Parent<T extends QQQ> extends GrandParent<T> {
public void paint(T component) {
}
}
// this overriding should be OK
class Child2 extends Parent {
}
class IDEA16494 {
class Base<B> {
public List<B> elements() {
return null;
}
}
class Derived<T> extends Base<T[]> {
}
class MostDerived extends Derived {
public List<MostDerived[]> elements() {
return null;
}
}
}
class IDEA16494Original {
class Base<B> {
public List<B> elements() {
return null;
}
}
class Derived<T> extends Base<T> {
}
class MostDerived extends Derived {
public List<MostDerived> elements() {
return null;
}
}
}
class IDEADEV23176Example {
public abstract class AbstractBase<E> extends AbstractParent<E> implements Interface<E> {
}
public abstract class AbstractParent<E> {
public void Implemented(Collection<?> c) {
}
public abstract void mustImplement();
}
public class Baseclass extends AbstractBase implements Interface {
public void mustImplement() {
}
}
public interface Interface<E> {
void Implemented(Collection<?> c);
}
}
/** @noinspection UnusedDeclaration*/
class IDEADEV26185
{
public static abstract class SuperAbstract<Owner, Type>
{
public abstract Object foo(Type other);
}
public static abstract class HalfGenericSuper<Owner> extends SuperAbstract<Owner, String>
{
public abstract Object foo(String other);
}
public static abstract class AbstractImpl<Owner> extends HalfGenericSuper<Owner>
{
public Object foo(String other)
{
return null;
}
}
public static class Concrete extends AbstractImpl
{
}
}
class ideadev30090 {
abstract class MyBeanContext
implements MyListInterface/*<MyListMember>*/ {
public Object get(int index) {
return null;
}
}
interface MyListInterface<E extends MyListMember>
extends List<E> {
}
interface MyListMember {
void f();
}
}
//////////////////////////////////////////
class IDEADEV32421 {
interface InterfaceWithFoo {
Class<?> foo();
}
class ParentWithFoo implements InterfaceWithFoo {
public Class foo() {
return null;
}
}
class TestII extends ParentWithFoo implements InterfaceWithFoo {
}
}
class IDEADEV32421_TheOtherWay {
interface InterfaceWithFoo {
Class foo();
}
class ParentWithFoo implements InterfaceWithFoo {
public Class<?> foo() {
return null;
}
}
class TestII extends ParentWithFoo implements InterfaceWithFoo {
}
}
//////////////////////////////////////
class SBBug {
abstract class A<T> implements Comparable<A<T>> {}
class B extends A {
public int compareTo(Object o) {
return 0;
}
}
}
class SBBug2 {
abstract class A<T> implements Comparable<A<T>> {}
<error descr="Class 'B' must either be declared abstract or implement abstract method 'compareTo(T)' in 'Comparable'">class B extends A</error> {
public int compareTo(A o) {
return 0;
}
}
}