我正在尝试从Java marc4j克隆一个Recrod类 与
private Record copyRecord(Record record) {
Record f = new Record();
f.set(record.get());
return f;
}
但是我得到了一个java.lang.RuntimeException:错误:org.marc4j.marc.Record是抽象的;无法实例化 在线 f.set(record.get());
请记住我的java技能有限, 所以问题是
如何获得原始类的克隆,我可以操作并更改其值而不会弄乱原始的类数据和方法?
提前致谢 问候, 哈利
答案 0 :(得分:1)
您无法实例化Record
,因为它是一个界面。
如果您想要复制Record
,可以使用MarcStreamWriter
和MarcStreamReader
,但这似乎超出了顶部:
public Record copyRecord(Record r)
{
ByteArrayOutputStream boas = new ByteArrayOutputStream();
MarcStreamWriter mw = new MarcStreamWriter(boas);
mw.write(r);
byte[] ba = boas.toByteArray();
ByteArrayInputStream bois = new ByteArrayInputStream(ba);
MarcStreamReader mr = new MarcStreamReader(bois);
Record r2 = null;
if(mr.hasNext())
r2 = mr.next();
return r2;
}
您可能需要在此处理一些例外情况,并关闭作家/读者。
答案 1 :(得分:0)
这里有一些定义。首先,类Record
必须具有适当的方法。基于此documentation,我们没有方法:set()
和get()
。
例如,假设我们有一个班级Record
:
public class Record{
...
public Record get(){
...
return rc;
}
public void set(Record r){
...
}
}
现在,您的代码将起作用:
private Record copyRecord(Record record) {
Record f = new Record();
f.set(record.get());
return f;
}
要克隆(制作新实例)您需要的课程:
...
Record rd1 = new Record(); //To make a new instance
Record rd2 = new Record(); // To make a new instance
...
现在,当你这样做时:
rd1 = rd2; //You will relate this two references (variables) to the single object
现在,当您自动更改rd1时,您将更改rd2,反之亦然。
答案 2 :(得分:0)
我认为您应该使用MarcFactory
。添加领导者。添加VariableFields
。如果我是正确的,那应该是完整的。
private static Record cloneRecord(Record record)
{
Record outputRecord = MarcFactory.newInstance().newRecord();
outputRecord.setLeader(record.getLeader());
for(VariableField variableField : record.getVariableFields())
{
outputRecord.addVariableField(variableField);
}
return outputRecord;
}