import java.util.ArrayList;
import java.util.List;
import testlib.util.*;
public class Supertypes {
static interface Inter<E> {}
static class A extends ArrayList<String> implements Inter<@Odd String> {}
static class B extends ArrayList<@Odd String> implements Inter<String> {}
A a1;
@Odd A a2;
B b1;
@Odd B b2;
void testSelf() {
//:: error: (assignment.type.incompatible)
@Odd A t1 = a1; // should emit error
@Odd A t2 = a2;
//:: error: (assignment.type.incompatible)
@Odd B t3 = b1; // should emit error
@Odd B t4 = b2;
}
void testList() {
List<String> l1 = a1;
List<String> l2 = a2;
//:: error: (assignment.type.incompatible)
List<String> l3 = b1; // should emit error
//:: error: (assignment.type.incompatible)
List<String> l4 = b2; // should emit error
//:: error: (assignment.type.incompatible)
List<@Odd String> l5 = a1; // should emit error
//:: error: (assignment.type.incompatible)
List<@Odd String> l6 = a2; // should emit error
List<@Odd String> l7 = b1;
List<@Odd String> l8 = b2;
}
void testInter() {
//:: error: (assignment.type.incompatible)
Inter<String> l1 = a1; // should emit error
//:: error: (assignment.type.incompatible)
Inter<String> l2 = a2; // should emit error
Inter<String> l3 = b1;
Inter<String> l4 = b2;
Inter<@Odd String> l5 = a1;
Inter<@Odd String> l6 = a2;
//:: error: (assignment.type.incompatible)
Inter<@Odd String> l7 = b1; // should emit error
//:: error: (assignment.type.incompatible)
Inter<@Odd String> l8 = b2; // should emit error
}
void testListOp() {
String s1 = a1.get(0);
String s2 = a2.get(0);
String s3 = b1.get(0);
String s4 = b2.get(0);
//:: error: (assignment.type.incompatible)
@Odd String s5 = a1.get(0); // should emit error
//:: error: (assignment.type.incompatible)
@Odd String s6 = a2.get(0); // should emit error
@Odd String s7 = b1.get(0);
@Odd String s8 = b2.get(0);
}
void ListIterable() {
for (String s : a1) ;
for (String s : a2) ;
for (String s : b1) ;
for (String s : b2) ;
//:: error: (enhancedfor.type.incompatible)
for (@Odd String s : a1) ; // should emit error
//:: error: (enhancedfor.type.incompatible)
for (@Odd String s : a2) ; // should emit error
for (@Odd String s : b1) ;
for (@Odd String s : b2) ;
}
}