Вы можете уменьшить свой код, просто выполнив:
interface DataObject {
public <T> void copyFrom(T impl);
}
или чтобы быть более кратким:
interface DataObject {
public <T extends DataObject> void copyFrom(T impl);
}
Вы можете использовать это, позвонив:
o.copyFrom(new DataObjectImpl());
o.<DataObjectImpl> copyFrom(new DataObjectImpl());
При использовании обобщений реализация DataObject всегда будет стираться во время выполнения.Кажется нелогичным знать о реализации, потому что вы должны программировать для интерфейса.На вашем месте я мог бы изучить объекты передачи данных или клонирование .
Как говорит Джош Блох, use interfaces only to define types
.
Если ваштип был определен как:
interface DataObject {
byte[] getData();
Long getId();
Timestamp getCreateDtTm();
}
Ваш импл может содержать:
class DataObjectImpl implements DataObject {
// member vars
public DataObjectImpl(DataObject dataObject) {
this.data = dataObject.getData();
this.id = dataObject.getId();
this.createDtTm = dataObject.getCreateDtTm();
}
//getters and setters
}
Стратегия реализации или копирования не будет иметь значения, потому что любая реализация подчиняется контракту типа и может быть уменьшена доэто четко определенный тип.