java - Comparator for Optional -
java - Comparator for Optional<T> -
i have abstract class optionalcomparator<t extends comparable<t>> implements comparator<optional<t>>
so far, good.
following model used optional itself, figured best have single instance of class, , cast when necessary (for example, optionalcomparator<integer>
).
so made private static final optionalcomparator<? extends comparable<?>> absent_first
.
the problem came when tried assign value. should type be?
new optionalcomparator<comparable<object>>() {...}
doesn't work.
new optionalcomparator<comparable<comparable<object>>>() {...}
doesn't work.
new optionalcomparator<integer>() {...}
work, example, want least-specific type possible.
what doing wrong? how can create base-case instance of class?
you can have multiple implementations of optionalcomparator
this:
private static final optionalcomparator<? extends comparable<?>> absent_first = new absentfirst<>(); private static final optionalcomparator<? extends comparable<?>> absent_last = new absentlast<>(); private interface optionalcomparator<t extends comparable<t>> extends comparator<optional<t>> { } private static class absentfirst<t extends comparable<t>> implements optionalcomparator<t> { @override public int compare(optional<t> obj1, optional<t> obj2) { if (obj1.ispresent() && obj2.ispresent()) { homecoming obj1.get().compareto(obj2.get()); } else if (obj1.ispresent()) { homecoming -1; } else if (obj2.ispresent()) { homecoming 1; } else { homecoming 0; } } } private static class absentlast<t extends comparable<t>> implements optionalcomparator<t> { @override public int compare(optional<t> obj1, optional<t> obj2) { if (obj1.ispresent() && obj2.ispresent()) { homecoming obj1.get().compareto(obj2.get()); } else if (obj1.ispresent()) { homecoming 1; } else if (obj2.ispresent()) { homecoming -1; } else { homecoming 0; } } } static <t extends comparable<t>> optionalcomparator<t> absentfirstcomparator() { @suppresswarnings("unchecked") optionalcomparator<t> comp = (optionalcomparator<t>) absent_first; homecoming comp; } static <t extends comparable<t>> optionalcomparator<t> absentlastcomparator() { @suppresswarnings("unchecked") optionalcomparator<t> comp = (optionalcomparator<t>) absent_last; homecoming comp; } public static void main(string... args) { optionalcomparator<integer> absentfirstint = absentfirstcomparator(); system.out.println(absentfirstint.compare(optional.of(1), optional.empty())); optionalcomparator<integer> absentlastint = absentlastcomparator(); system.out.println(absentlastint.compare(optional.of(1), optional.empty())); optionalcomparator<double> absentfirstdouble = absentfirstcomparator(); system.out.println(absentfirstdouble.compare(optional.of(1.0), optional.empty())); optionalcomparator<double> absentlastdouble = absentlastcomparator(); system.out.println(absentlastdouble.compare(optional.of(1.0), optional.empty())); }
output:
-1 1 -1 1
java generics guava
Comments
Post a Comment