Skip to content

Instantly share code, notes, and snippets.

@evacchi
Last active March 15, 2018 09:51
Show Gist options
  • Save evacchi/e4d87232bc90ca6d2adc230377a8d490 to your computer and use it in GitHub Desktop.
Save evacchi/e4d87232bc90ca6d2adc230377a8d490 to your computer and use it in GitHub Desktop.
abstract class Animal<F extends Food> { abstract void eats(F f);}
abstract class Food {}
class Veg extends Food {}
class Meat extends Food {}
class Grass extends Veg {}
class Carrot extends Veg {}
class Cow extends Animal<Veg> { void eats(Veg f) {}}
class Main {
public static void main(String[] args) {
Cow cow = new Cow();
cow.eats(new Meat());
}
}
abstract class Money<A extends Money<A>> { abstract A add(A m); }
class Fiat extends Money<Fiat> {
@Override
Fiat add(Fiat m) {
return m;
}
}
class Metal extends Money<Metal> {
@Override
Metal add(Metal m) {
return m;
}
}
class Main {
public static void main(String[] args) {
Fiat f = new Fiat();
Fiat f2 = new Fiat();
Fiat ff = f.add(f2);
System.out.println(add(f2, ff));
}
static <T extends Money<T>> T add(T a, T b) {
return a.add(b);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment