Java Generics enforcing compatible wildcards

Seems that it’s better to parameterize Socket and Wire with color:

interface Socket<C extends Color> {}
interface Wire<C extends Color> {}

class RedSocket implements Socket<Red> {}
class GreenSocket implements Socket<Green> {}
class RedWire implements Wire<Red> {}
class GreenWire implements Wire<Green> {}

This way you can introduce one more generic parameter to the Connection:

public class Connection<C extends Color, M extends Wire<C>, Q extends Socket<C>> {...}

And use it like this:

new Connection<Red, RedWire, RedSocket>(); // ok
new Connection<Green, GreenWire, GreenSocket>(); // ok
new Connection<Green, GreenWire, RedSocket>(); // error

Leave a Comment

error code: 521