import java.util.Map; interface MethodProperty<ActualType extends MethodProperty<ActualType>> { public void copyFrom(ActualType other); } class MethodPropertyDatabase<Property extends MethodProperty<Property>> { Map<String, Property> propertyMap; void read(String fileName) { } } class FooProperty implements MethodProperty<FooProperty> { String value; public void copyFrom(FooProperty other) { this.value = other.value; } } class FooPropertyDatabase extends MethodPropertyDatabase<FooProperty> { } public class GenericsBug { FooPropertyDatabase fooDatabase; public void readDatabase() { FooPropertyDatabase database = new FooPropertyDatabase(); fooDatabase = readDatabase(database, "foodatabase.db"); } private <Property extends MethodProperty<Property>, DatabaseType extends MethodPropertyDatabase<Property>> DatabaseType readDatabase( DatabaseType database, String fileName) { database.read(fileName); return database; } }