All,
I am converting a project from Xcode 2.x (WO 5.3) to Eclipse 3.4 (WO
5.4.2). I have decided to also "upgrade" to using generics. So far,
it has not been a fun experience. I've read over the threads on this
list and several of the external references provided. Each time I
think I have it figured out and try it on my code, I soon discover
that I must be missing something. In many (but not all) cases, I was
able to clear up the errors and warnings by making everything <?> or
<? extends Object> but it just seems wrong to have to explicitly tell
it to use whatever it wants. Below are a few examples of some typical
code snippets that are causing problems. What is the correct way to
write these using generics?
Based on further reading, I know this is not the right way to write
this, but it works and does not generate errors/warnings.
NSDictionary<Object, Object> tmpDict = new NSDictionary<Object, Object>(
new NSArray<Object>( new Object[] { location, schedType,
Integer.valueOf( nWeekday) } ),
new NSArray<Object>( new Object[] { "toLocation", "toScheduleType",
"toDay.displayOrder" } ) );
NSArray<?> schedules = EOUtilities.objectsMatchingValues( ec,
"Schedule", tmpDict );
---------
In theory, I believe this is the "more correct" way to write it but
this generates warnings/errors
NSDictionary<String, ? extends Object> tmpDict = new
NSDictionary<String, ? extends Object>(
new NSArray<? extends Object>( new Object[] { location, schedType,
Integer.valueOf( nWeekday ) } ),
new NSArray<? extends Object>( new Object[] { "toLocation",
"toScheduleType", "toDay.displayOrder" } ) );
NSArray<Schedule> schedules = EOUtilities.objectsMatchingValues( ec,
"Schedule", tmpDict );
One problem with this approach is that, while the keys are, for all
intents and purposes, Strings, you have to declare the array as
<Object> because it is created with "new Object[] { entries }."
---------
Here, I get a warning icon in the gutter of the first line telling me
"The expression on type NSArray needs unchecked conversion to conform
to NSArray<Schedule>." I'm sure this is because EOUtilities don't
explicitly return an array of Schedules. But, if I change it to <?>
or <? extends EOGenericRecord> or <? extends EOCustomRecord>, then
the warning goes away and the next line generates an error icon and
complains about the signature of showSchedules(). Again, when I alter
that, it cascades like dominoes.
NSArray<Schedule> schedules = EOUtilities.objectsForEntityNamed( ec,
"Schedule" );
showSchedules( schedules );
public static void showSchedules( NSArray<Schedule> schedules );
---------
availabilityByPeriods is a dictionary of dictionaries of strings
{ PERIOD = { "HHMM" = "1"; } }
sKey = "MMDDYYYY_HHMM"
public static NSMutableDictionary<String, ? extends Object>
arrangeTimeSlotsByPeriod( NSMutableDictionary<String, ? extends
Object> availabilityByPeriods, String sKey )
{
NSMutableDictionary<String, ? extends Object> dateDict = new
NSMutableDictionary<String, Object>();
NSMutableDictionary<String, ? extends Object> periodDict = new
NSMutableDictionary<String, Object>();
String sDate = sKey.substring( 0, 8 );
String sTime = sKey.substring( 9 );
int nPeriod = TimePeriod.timePeriodForKey( sKey );
if ( availabilityByPeriods.objectForKey( sDate ) == null )
availabilityByPeriods.setObjectForKey( dateDict, sDate );
// Type safety: Unchecked cast from capture#40-of ? extends Object to
NSMutableDictionary<String, ? extends Object>
dateDict = (NSMutableDictionary<String, ? extends Object>)
availabilityByPeriods.objectForKey( sDate );
if ( dateDict.objectForKey( TimePeriod.dayPeriods.objectAtIndex
( nPeriod ) ) == null )
dateDict.setObjectForKey( periodDict,
TimePeriod.dayPeriods.objectAtIndex( nPeriod ) );
// Type safety: Unchecked cast from capture#45-of ? extends Object to
NSMutableDictionary<String, ? extends Object>
periodDict = (NSMutableDictionary<String, ? extends Object>)
dateDict.objectForKey( TimePeriod.dayPeriods.objectAtIndex
( nPeriod ) );
periodDict.setObjectForKey( "1", sTime ); // Value is unimportant
return availabilityByPeriods;
}
How can I find "capture #x of type expression" as referenced in the
error messages?
---------
This one is even more confusing to me. It looks the same as some of
the snippets above. Yet, in this case, it complains that "the
constructor NSDictionary<String, Object>( NSArray<Object>,
NSArray<Object> ) is undefined."
NSDictionary<String, ? extends Object> tmpDict = new
NSDictionary<String, Object>(
new NSArray<Object>( new Object[] { location, schedType,
Integer.valueOf(nWeekday) } ),
new NSArray<Object>( new Object[] { "toLocation", "toScheduleType",
"toDay.displayOrder" } ) );
Roger
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [EMAIL PROTECTED]