2017-06-15 95 views
2

我试图克隆从Java marc4j 一个Recrod类克隆一个marc4j记录类

private Record copyRecord(Record record) { 
    Record f = new Record(); 
    f.set(record.get()); 
    return f; 
} 

但是我得到一个了java.lang.RuntimeException:出现错误:org.marc4j.marc.Record是抽象的;无法实例化 on line f.set(record.get());

请记住,我的Java技能有限, 所以问题是

我怎样才能得到我可以操纵和改变其值,不会对原有类数据乱搞原始类的克隆和方法?

在此先感谢 问候, 哈利

回答

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,反之亦然。

+0

我不认为他们可以控制,因为“Record”是marc4j库的一部分 –

+0

是的,你说得对,但是使用这个文档我们没有它:http://projects.freelibrary.info/ freelib-marc4j/apidocs/org/marc4j/marc/class-use/Record.html –

+0

从文档看来,我们可以使用: RawRecord.getAsRecord(boolean permissive,boolean toUtf8,String combinePartials,String defaultEncoding) –

1

您不能实例化Record,因为它是一个接口。

如果你是想复制Record你可以使用一个MarcStreamWriterMarcStreamReader像这样 - 然而,这似乎在上面:

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; 
} 

您可能需要采取一些例外的照顾这里也关闭作家/读者。

+0

是的,你说得对,我要检查它的未来。谢谢 –