ceylon / ceylon-spec

DEPRECATED
Apache License 2.0
108 stars 34 forks source link

unsoundness with generic method with enumerated bound #1460

Open gavinking opened 8 years ago

gavinking commented 8 years ago

As seen here, the following code should be rejected by the typechecker:

class Lizt<out Item>() {

    value list = ArrayList<Item>();

    shared Item add<in InItem>(InItem i) 
            given InItem of Item { 
        list.add(i of Item);
        return i of Item; 
    }
}

class Person() {}
class Customer() extends Person(){}

shared void run2() {
    Lizt<Person> people = Lizt<Customer>();
    people.add<Person>(Person()); //Oops!!
}

The enumerated bound is a contravariant location!

Note that we do do the right check for upper bounds.