javac improperly rejects this program (detected by jacks 8.4.6.4-abstract-7)
/*
* @test %W% %E%
* @bug 4717181
* @summary javac treats inherited abstract method as an overrider
* @author gafter
*
* @compile T4717181a.java
*/
class T4717181a {
abstract class C {
abstract void m();
}
interface I {
void m();
}
abstract class D extends C implements I {}
}
and this
/*
* @test %W% %E%
* @bug 4717181
* @summary javac treats inherited abstract method as an overrider
* @author gafter
*
* @compile T4717181b.java
*/
class T4717181b {
static class E1 extends Exception {}
static class E2 extends Exception {}
static class E3 extends Exception {}
static abstract class Ta {
public abstract void m() throws E1, E2;
}
interface Tb {
void m() throws E2, E3;
}
static abstract class Tc extends Ta implements Tb {
{
try {
m(); // intersect throws clauses
} catch (E2 e2) {
}
}
}
}
/*
* @test %W% %E%
* @bug 4717181
* @summary javac treats inherited abstract method as an overrider
* @author gafter
*
* @compile T4717181a.java
*/
class T4717181a {
abstract class C {
abstract void m();
}
interface I {
void m();
}
abstract class D extends C implements I {}
}
and this
/*
* @test %W% %E%
* @bug 4717181
* @summary javac treats inherited abstract method as an overrider
* @author gafter
*
* @compile T4717181b.java
*/
class T4717181b {
static class E1 extends Exception {}
static class E2 extends Exception {}
static class E3 extends Exception {}
static abstract class Ta {
public abstract void m() throws E1, E2;
}
interface Tb {
void m() throws E2, E3;
}
static abstract class Tc extends Ta implements Tb {
{
try {
m(); // intersect throws clauses
} catch (E2 e2) {
}
}
}
}