Re: Number.parse( String s )
"Christopher Benson-Manica" <ataru@ukato.freeshell.org> wrote in message
news:eo2uec$flp$1@chessie.cirr.com...
Is there a good reason why Number does not declare an abstract method
parse() taking a string as a parameter?
Perhaps because it's undesirable to force all subclasses of Number to
implement this method? AtomicInteger, for example, doesn't seem to have a
parse method.
I want to create a generic
parsing class, with these methods as examples:
static int parseLong( Attributes attributes, String key ) {
return parseNumber( attributes, key, -1L );
}
static int parseLong( Attributes attributes, String key, Long def ) {
return parseNumber( attributes, key, def );
}
parseNumber ought to be able to be defined as
static <T extends Number> T parseNumber(Attributes attributes, String key,
T def ) {
final String value = attributes.getValue( key );
if( value == null ) {
return def;
}
return (T)defVal.getClass().parse( value ); // Unchecked cast, but safe
}
, but instead there's no choice (that I can see) but to use reflection:
static <T extends Number> T parseNumber(Attributes attributes, String key,
T def ) {
final String value = attributes.getValue( key );
if( value == null ) {
return def;
}
try {
return
(T)defVal.getClass().getConstructor(String.class).newInstance(value);
}
catch( Exception e ) { // Won't throw anything but NumberFormatException
return def;
}
}
How about using Map<CaseInsensitiveString,Number> instead of Attribute?
[*]
- Oliver
*: Where CaseInsensitiveString is a wrapper class which wraps String and
overrides equals and hashcode. You'll need to write it if you want the
case-insensitive key behaviour to be preserved from Attribute.