я работаю со следующим классом JAXB иерархии:Java Дженерики - я могу избавиться от сырьевого типа в этом случае использования
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(...)
public class RecordModifyType extends RecordBaseType
{
...
public List<FieldModifyType> getField() { ... }
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(...)
public class RecordAddType extends RecordBaseType
{
...
public List<FieldAddType> getField() { ... }
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(...)
public class FieldModifyType extends FieldBaseType
{
...
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(...)
public class FieldAddType extends FieldBaseType
{
...
}
я наткнулся на метод в другом классе со следующей подписью (обратите внимание на сырые типы):
private void createFields(FTPPartner user,
String addressMasterDataID,
String connectionMasterDataID,
CRTypeEnum crType,
List addrFields,
List connFields)
Этот метод вызывается из разных частей класса иногда с List<FieldAddType>
в качестве аргументов и другие времена, с List<FieldModifyType>
.
Теперь я пытаюсь избавиться от необработанных типов в его подписи.
После get-put principle, я решил изменить подпись
private void createFields(FTPPartner user,
String addressMasterDataID,
String connectionMasterDataID,
CRTypeEnum crType,
List<? super FieldBaseType> addrFields,
List<? super FieldBaseType> connFields)
{
...
FieldBaseType someField = new buildField(...);
addrFields.add(someField);
...
}
... поскольку реализация createFields является только положить вещи в этих коллекциях. Проблема заключается в том, что с RecordModifyType # GetFields() возвращает List<FieldModifyType>
и RecordAddType # GetFields() возвращает List<FieldAddType>
, я теперь не могу вызвать метод, поскольку он позволяет только для супер типов FieldBaseType, не подтипов:
RecordAddType addrRecord = getRecordAddType(...);
RecordAddType connRecord = getRecordAddType(...);
List<FieldAddType> addrFields = addrRecord.getFields();
List<FieldAddType> connFields = connRecord.getFields();
createFields(user,
addressMasterDataID,
connectionMasterDataID,
crType
addFields, // This won't compile
connFields); // This won't compile
marshalRecord(addrRecord);
marshalRecord(connRecord);
Использование исходных типов работает как ожидалось - ошибок компиляции и сортировки не существует.
Так что мой вопрос: есть ли способ сохранить поведение, но избавиться от необработанных типов?
Возможно, вы захотите создать небольшой и полный пример, который воспроизводит проблему. Неясно, какая ссылка находится между методом createFields и методами getField ... – assylias
Проблема заключается в api, вы не можете правильно использовать «List», где вы помещаете «FieldBaseType», используя rawtypes, ClassCastException, когда вы извлекаете его в другом классе. Другим решением будет создание нового arraylist для хранения 'FieldBaseType' из списка, возвращаемого' getFields() ' –
Ferrybig
. Как бы' createFields() 'решало, добавлять ли экземпляры' FieldAddType' или 'FieldModifyType'? – Thomas