Oops, I should have read the documentation better :) On Mon, Nov 23, 2009 at 1:22 PM, Uwe Schindler <u...@thetaphi.de> wrote:
> That is correct behaviour, because the target of copyTo must support all > interfaces implemented (see docs). So you cannot copy a Token to a > TermAttribute (because it would be a loss in information), but the other way > round is possible. > > ----- > Uwe Schindler > H.-H.-Meier-Allee 63, D-28213 Bremen > http://www.thetaphi.de > eMail: u...@thetaphi.de > ------------------------------ > > *From:* Shai Erera [mailto:ser...@gmail.com] > *Sent:* Monday, November 23, 2009 12:19 PM > *To:* java-dev@lucene.apache.org > *Subject:* Bug in Token.copyTo? > > > > Hi > > I think that Token.copyTo is buggy. It checks if the AttributeImpl is > instanceof Token, and if so reinits. However if it's not, it casts > AttributeImpl to *ALL* of TermAttribute, OffsetAttribute, > PositionIncrementAttribute etc. and sets them w/ the proper values. However, > one can pass an AttributeImpl which is not Token, but one of its > implementing interfaces, such as TermAttribute, and then the code breaks w/ > a ClassCastException. > > There's nothing in the API which prevents me from passing a non-Token > instance, and more than that - it looks as if the code tries to optimize for > a Token instance, but does not handle properly other cases. I think the > 'else' clause should include instanceof checks, because obviously I cannot > pass an instance that implements all of the interfaces and is not Token > (well I can, but what's the point, just use Token). > > Here is a short example which reproduces: > > Token token = new Token("hello", 0, 5); > TermAttributeImpl term = new TermAttributeImpl(); > > token.copyTo(term); > System.out.println(term); > > Shai >