@@ -0,0 +1,3 @@ | |||
public class Bean implements LongIdentifiable { | |||
} |
@@ -0,0 +1,5 @@ | |||
public interface Identifiable<T> { | |||
T getId(); | |||
void setId(T t); | |||
} |
@@ -0,0 +1,20 @@ | |||
public aspect IdentifiableAspect { | |||
declare parents: Bean implements LongIdentifiable; | |||
private Long LongIdentifiable.m_id; | |||
public Long LongIdentifiable.getId() { | |||
return m_id; | |||
} | |||
public void LongIdentifiable.setId(Long id) { | |||
m_id= id; | |||
} | |||
public static void main(String []argv) { | |||
Bean b = new Bean(); | |||
b.setId(37L); | |||
long l = b.getId(); | |||
if (l!=37L) throw new RuntimeException("id should be 37"); | |||
} | |||
} |
@@ -0,0 +1,2 @@ | |||
public interface LongIdentifiable extends Identifiable<Long> { | |||
} |
@@ -208,9 +208,8 @@ public class GenericsTests extends XMLBasedAjcTestCase { | |||
runTest("Compilation error on generic member introduction"); | |||
} | |||
public void testGenericsOverrides() { | |||
runTest("generics and ITD overrides"); | |||
} | |||
public void testGenericsOverrides_1() { runTest("generics and ITD overrides - 1"); } | |||
public void testGenericsOverrides_2() { runTest("generics and ITD overrides - 2"); } | |||
public void testPR88606() { | |||
runTest("Parameterized types on introduced fields not correctly recognized"); |
@@ -191,7 +191,13 @@ | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="java5/generics/bugs/lists" title="generics and ITD overrides"> | |||
<ajc-test dir="java5/generics/bugs/lists/case1" title="generics and ITD overrides - 1"> | |||
<compile files="Identifiable.java,Bean.java,LongIdentifiable.java,IdentifiableAspect.java" options="-1.5"> | |||
</compile> | |||
<run class="IdentifiableAspect"/> | |||
</ajc-test> | |||
<ajc-test dir="java5/generics/bugs/lists/case2" title="generics and ITD overrides - 2"> | |||
<compile files="Identifiable.java,Bean.java,LongIdentifiable.java,IdentifiableAspect.java" options="-1.5"> | |||
</compile> | |||
<run class="IdentifiableAspect"/> |
@@ -1424,7 +1424,10 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl | |||
private boolean compareToExistingMembers(ConcreteTypeMunger munger, Iterator existingMembers) { | |||
ResolvedMember sig = munger.getSignature(); | |||
while (existingMembers.hasNext()) { | |||
ResolvedMember existingMember = (ResolvedMember)existingMembers.next(); | |||
// don't worry about clashing with bridge methods | |||
if (existingMember.isBridgeMethod()) continue; | |||
//System.err.println("Comparing munger: "+sig+" with member "+existingMember); | |||
if (conflictingSignature(existingMember, munger.getSignature())) { | |||
//System.err.println("conflict: existingMember=" + existingMember + " typeMunger=" + munger); | |||
@@ -1501,7 +1504,6 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl | |||
} | |||
boolean incompatibleReturnTypes = false; | |||
// In 1.5 mode, allow for covariance on return type | |||
if (world.isInJava5Mode() && parent.getKind()==Member.METHOD) { | |||