2016-06-01 17 views
0

Ich habe eine vorhandene JFreeChart Plugin-Klasse, die nicht zu Scala v2.11 konvertieren wird, es ist kniffliger als es scheint. Die Java ist:Einfache Idiomatische Möglichkeit, eine Java-Klasse zu konvertieren, die Comparator & Comparable zu Scala implementiert?

package x; 
import org.apache.commons.lang.NotImplementedException; 
import org.jfree.data.time.RegularTimePeriod; 
import java.io.Serializable; 
import java.math.BigDecimal; 
import java.math.MathContext; 
import java.math.RoundingMode; 
import java.util.Calendar; 
import java.util.Comparator; 
import java.util.Date; 

public final class IntervalJFreeChart extends RegularTimePeriod implements Comparator, Comparable, Serializable { 

final int width; 
final long seqNo; 

final long firstMilli; 
final long lastMilli; 

public IntervalJFreeChart(Date time, int w) { 
    MathContext mc = new MathContext(16, RoundingMode.FLOOR); 
    width = w; 
    BigDecimal wbd = new java.math.BigDecimal(""+w); 
    wbd.setScale(120, RoundingMode.FLOOR); 
    BigDecimal bd = new java.math.BigDecimal(time.getTime()); 
    bd.setScale(120, RoundingMode.FLOOR); 
    seqNo = bd.divide(wbd, mc).longValue(); 

    BigDecimal seqBd = new java.math.BigDecimal(seqNo); 
    seqBd.setScale(120, RoundingMode.FLOOR); 
    firstMilli = seqBd.multiply(wbd).longValue(); 
    lastMilli = firstMilli + w -1; 
} 

@Override 
public IntervalJFreeChart previous() { 
    return new IntervalJFreeChart(new Date(firstMilli - width), width); 
} 

@Override 
public IntervalJFreeChart next() { 
    return new IntervalJFreeChart(new Date(lastMilli + width), width); 
} 

@Override 
public long getSerialIndex() { 
    return this.seqNo; 
} 

@Override 
public void peg(Calendar calendar) { 
    throw new NotImplementedException("peg()"); 
} 

@Override 
public long getFirstMillisecond() { 
    return firstMilli; 
} 

@Override 
public long getFirstMillisecond(Calendar calendar) { 
    calendar.setTimeInMillis(firstMilli); 
    return firstMilli; 
} 

@Override 
public long getLastMillisecond() { 
    return lastMilli; 
} 

@Override 
public long getLastMillisecond(Calendar calendar) { 
    calendar.setTimeInMillis(lastMilli); 
    return lastMilli; 
} 

@Override 
public int compareTo(Object o) { 
    return compare(this, o); 
} 

@Override 
public int compare(Object o1, Object o2) { 
    if (o2 instanceof IntervalJFreeChart) { 
     final IntervalJFreeChart m1 = (IntervalJFreeChart)o1; 
     final IntervalJFreeChart m2 = (IntervalJFreeChart)o2; 
     final int diff = Long.valueOf(m1.seqNo).compareTo(m2.seqNo); 
     if (diff > 0) return 1; 
     if (diff < 0) return -1; 
     return 0; 
    } 
    throw new RuntimeException("MilliInterval: compare error : "); 
} 
} 

Die Frage, die ich zu sehen bin, ist: abstrakte Klasse RegularTimePeriod implementiert Java Vergleichbare Schnittstelle ohne einen Typparameter für sie angeben. Die Scala-Implementierung benötigt daher beide: konkrete Vergleicher und Vergleichbar.

Beratung sehr geschätzt.

+0

Warum 2.8? Es ist eine sehr, sehr alte Version. –

+0

6 Jahre, um genau zu sein https://en.wikipedia.org/wiki/Scala_(programming_language)#cite_ref-52 – Reactormonk

+0

Danke, dass ich darauf hingewiesen habe, ich habe es auf 2.11 aktualisiert. – Lee

Antwort

1

Da die Klasse tatsächlich nur mit IntervalJFreeChart vergleichen kann, verwenden Sie einfach Comparable[IntervalJFreeChart].