On 12/19/2010 4:15 AM, Dan Creswell wrote:
This somewhat speaks to the problems we'd face as the result of two separate
compiles for two separate clients and runtime classloading. One dev
specifies an Entry:

Test<Integer, String>

Another specifies:

Test<String, Integer>

If we assume we match on Test instances ignoring the generics and only the
anId field is set, then each client could end up with an instance of Test
that doesn't fit with it's templated/specified at compile-time typing.

I think previously, Peter was alluding to the inclusion of Generics in the APIs to promote the use of Generics by developers in this way. Clearly, whatever change we make to JavaSpaces won't preclude this happening. We need to provide some guidance documentation or something that says things like the following.

"When you use generics in remote applications, you need to understand that the type of any Generic specified type is not considered by the type matching in JavaSpaces. If you have a class defined as follows,

public class Test<T,K> extends Entry {
        T one;
        K two;
        String someThing;
}

Then you should not use that as the primary type in your APIs. Instead, you should consider making that class "abstract" so that it can not be instantiated incorrectly, and then create sub-classes with bound types that your application uses to make sure that the true generic typing is concretely defined. Something as simple as the following would then be used as the class that your application uses.

public class IntStrTest extends Test<Integer,String> {}

Thus, you can share the code and implementation details, and still know that the Generic types are concretely defined by the class."

This is, at least what I try and stress and use. In many cases, adding generics in this way will reduce some casting. But in cases like JavaSpaces APIs where there are return value and argument type linear type requirements, then proposed change in declaration can also remove casting and not introduce any additional risk of type confusion. Your example, Dan happens to be possible and problematic no matter which way the API works. The idea behind the change is to simply dictate the returned values type so that casting is eliminated there.

We can't fix the problem with people putting non-concrete types into the space without adding additional logic to EntryRep construction so that it collects this information and the space utilizes it during matching. If we do it there, then we are essentially changing the spec to require more specific type matching. I'd say it's not a spec incompatible change to do that, but because it might break some carefully crafted hacks that are possible now, we might need to investigate more.

Gregg Wonderly

Gregg Wonderly

Reply via email to