This structure should fulfill your expectations, by giving a compilation error when an attempting to add an incorrect Configuration
type to a Resource
:
abstract class Configuration {
}
class LogicalConfiguration extends Configuration {
}
class PhysicalConfiguration extends Configuration {
}
abstract class Resource<C extends Configuration> {
private C config;
public void addConfiguration(C config) {
this.config = config;
}
public C getConfig() {
return config;
}
}
class LogicalResource extends Resource<LogicalConfiguration> {
}
class PhysicalResource extends Resource<PhysicalConfiguration> {
}
Use it exactly as you do in your example:
Resource resource = new PhysicalResource()
Configuration config = new LogicalResourceConfiguration();
//COMPILATION ERROR:
physicalResource.addConfiguration(config);