Ok, so here is my problem:
I have a list containing interfaces - List<Interface> a - and a list of interfaces that extend that interface: List<SubInterface> b.  I want to set a = b.  I do not wish to use addAll() or anything that will cost more memory as what I am doing is already very cost-intensive.  I literally need to be able to say a = b.  I have tried List<? extends Interface> a, but then I cannot add Interfaces to the list a, only the SubInterfaces.  Any suggestions?
I want to be able to do something like this:
List<SubRecord> records = new ArrayList<SubRecord>();
//add things to records
recordKeeper.myList = records;
The class RecordKeeper is the one that contains the list of Interfaces (NOT subInterfaces)
public class RecordKeeper{
    public List<Record> myList;
}
                In Java, the List interface is an ordered collection that allows us to store and access elements sequentially. It extends the Collection interface.
Generic interfaces can inherit from non-generic interfaces if the generic interface is covariant, which means it only uses its type parameter as a return value.
This works :
public class TestList {
    interface Record {}
    interface SubRecord extends Record {}
    public static void main(String[] args) {
        List<? extends Record> l = new ArrayList<Record>();
        List<SubRecord> l2 = new ArrayList<SubRecord>();
        Record i = new Record(){};
        SubRecord j = new SubRecord(){};
        l = l2;
        Record a = l.get( 0 );
        ((List<Record>)l).add( i );       //<--will fail at run time,see below
        ((List<SubRecord>)l).add( j );    //<--will be ok at run time
    }
}
I mean it compiles, but you will have to cast your List<? extends Record> before adding anything inside. Java will allow casting if the type you want to cast to is a subclass of Record, but it can't guess which type it will be, you have to specify it.
A List<Record> can only contain Records (including subRecords), A List<SubRecord> can only contain SubRecords. 
But A List<SubRecord> is not a List<Record> has it cannot contains Records, and subclasses should always do what super classes can do. This is important as inheritance is specilisation, if List<SubRecords> would be a subclass of List<Record>, it should be able to contain ` but it'S not.
A List<Record> and a List<SubRecord> both are List<? extends Record>. But in a List<? extends Record> you can't add anything as java can't know which exact type the List is a container of. Imagine you could, then you could have the following statements : 
List<? extends Record> l = l2;
l.add( new Record() );
As we just saw, this is only possible for List<Record> not for any List<Something that extends Record> such as List<SubRecord>.
Regards, Stéphane
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With