When successful, Infer Type does several changes to a program, which are sometimes hard to trace. Unfortunately, these changes cannot be undone automatically. You can preview the changes by inspecting the type hierarchy presented in the New types dialog, but there is no preview comparable to that of other Eclipse refactorings.
perhaps sometime
Sometimes Infer Type computes a type whose
inferred protocol (set of members) is identical to that of some
other type already subtyped by the declaration elements
original type. In this case, Infer Type decides that the existing
type should be used (and no new one introduced). However, this
need not always make sense. For instance, if Infer Type computes
that the inferred protocol of a declaration element is empty, it
could suggest Serializable
as its inferred type (even though the use of the declaration
element has nothing to do with serialization and, what is much
worse, many other, otherwise totally unrelated classes implement Serializable
and
therefore become substitutable).
Since there is no information from which Infer Type could deduce that an existing interface with the required protocol and supertypes does not reflect the intended semantics of a program (i.e., allows assignment of objects that were intentionally excluded by the original type), it will use this type. The alternative would be to introduce a new interface with the same protocol, but perhaps fewer implementing classes, which in most cases would lead to a proliferation of types (and might fail to express that two interfaces, or roles, are actually the same).
In case Infer Type computes an empty
interface, it always uses Object
.
A binary method is characterized by a parameter type that is the same as the receiver type, i.e., the enclosing class. If Infer Type is applied to a formal paramater of a binary method, it computes a new supertype for it, but does not move the method declaration to this supertype. The method is therefore no longer binary, at least not in the strict sense. Other than that, however, the program remains correct.
The problem dissolves if the binary method makes use of double
dispatch. In this case, parameter and receiver swap roles, in
whose course the parameter becomes this
.
Since this requires assignment compatibility of parameter and
owner, the type of this
must be a supertype of the parameter's type and vice versa, which
implies that both must be the same.
When Infer Type moves a method declaration to a newly introduced supertype, it does not take the comments (including JavaDocs) with it. As a result, the new interfaces remain undocumented. In order not to lose these comments, Infer Type refrains from deleting the original (abstract) method declarations.
Could be done ...
When Infer Type moves an abstract method declaration from an abstract class or interface to a newly introduced supertype, it could delete the original declaration. However, because it currently doesn't move the comments (see above), it leaves the (now superfluous) method declarations untouched.
Could be done ...
© The IntoJ Team, 2005.