<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://dev.eiffel.com/index.php?action=history&amp;feed=atom&amp;title=Covariance_and_generics_case_study</id>
		<title>Covariance and generics case study - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://dev.eiffel.com/index.php?action=history&amp;feed=atom&amp;title=Covariance_and_generics_case_study"/>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;action=history"/>
		<updated>2026-05-19T21:49:18Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10947&amp;oldid=prev</id>
		<title>Clemahieu at 07:54, 13 April 2008</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10947&amp;oldid=prev"/>
				<updated>2008-04-13T07:54:33Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 07:54, 13 April 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 31:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 31:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;item_list: THING[INTEGER]&amp;lt;/e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;item_list: THING[INTEGER]&amp;lt;/e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To create a new covariant &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;list &lt;/del&gt;class requires a class definition:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To create a new covariant &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;thing &lt;/ins&gt;class requires a class definition:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;class&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;class&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10946&amp;oldid=prev</id>
		<title>Clemahieu at 07:53, 13 April 2008</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10946&amp;oldid=prev"/>
				<updated>2008-04-13T07:53:47Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;These are some observations I had when comparing using generics and covariant redefinition in a project I'm working on.  I had implemented it using generics but as I was progressing the usage of generics was becoming increasingly tedious and in the end, wasn't saving me any time or making things easier to understand.&lt;br /&gt;
&lt;br /&gt;
Feel free to comment, edit, add.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Class text length and complexity is similar between generics and covariants equivalents&lt;br /&gt;
&amp;lt;e&amp;gt;class&lt;br /&gt;
THING[G]&lt;br /&gt;
feature&lt;br /&gt;
item: G&lt;br /&gt;
put(new: G) is&lt;br /&gt;
do&lt;br /&gt;
item := new&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
THING&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
item: ANY&lt;br /&gt;
put(new: like item) is&lt;br /&gt;
do&lt;br /&gt;
item := new&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Differences in creating derived types&lt;br /&gt;
To create a new generic class:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
item_list: THING[INTEGER]&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To create a new covariant list class requires a class definition:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
THING&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Covariantly redefined classes are not cross-assignable like their generic counterparts:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
LIBRARY_A_INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
THING&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
LIBRARY_B_INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
LIST&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
feature&lt;br /&gt;
covariant_cross_assign(a: LIBRARY_A_INTEGER_THING) is&lt;br /&gt;
local&lt;br /&gt;
b: LIBRARY_B_INTEGER_THING&lt;br /&gt;
do&lt;br /&gt;
b := a -- Doesn't compile even though they are semantically equal.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
feature&lt;br /&gt;
generic_cross_assign(library_a_list: THING[INTEGER]) is&lt;br /&gt;
local&lt;br /&gt;
library_b_list: THING[INTEGER]&lt;br /&gt;
do&lt;br /&gt;
library_b_list := library_a_list&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Generic parameterization geometrically increases text of type definition at usage points as inheritence depth increases:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
params: ECDOMAINPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP], ECPRIVATEKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]]&lt;br /&gt;
ecdsa: ECDSA_SIGNER [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
keys: LINKED_LIST[ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP], ECPRIVATEKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]]]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Covariant redefinition greatly simplifies typing at usage points:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
params: ECDOMAINPARAMETERS&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS&lt;br /&gt;
pair: ECKEYPAIR&lt;br /&gt;
ecdsa: ECDSA_SIGNER&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER&lt;br /&gt;
keys: LINKED_LIST[ECKEYPAIR]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can &amp;quot;cheat&amp;quot; the generics solution and use the anchored type keyword 'like' as a shorthand for types.  This is using the 'like' keyword as a macro instead of an anchored type.  This shortens text but doesn't decrease complexity at the usage point and isn't using the keyword for what it was designed for.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
c: ECCURVE[ECFIELDELEMENTFP]&lt;br /&gt;
p: ECPOINT[ECFIELDELEMENTFP]&lt;br /&gt;
e: ECFIELDELEMENTFP&lt;br /&gt;
params: ECDOMAINPARAMETERS [like c, like p, like e]&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR [like c, like p, like e]&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS [like c, like p, like e]&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [like c, like p, like e], ECPRIVATEKEYPARAMETERS [like c, like p, like e]]&lt;br /&gt;
ecdsa: ECDSA_SIGNER [like c, like p, like e]&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER [like c, like p, like e]&lt;br /&gt;
keys: LINKED_LIST[like pair]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Intermediate classes need to carry the generics of their suppliers and heirs causing geometric type definition increase&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
ECCURVE [G -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
feature&lt;br /&gt;
a: G&lt;br /&gt;
b: G&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECPUBLICKEYPARAMETERS [G -&amp;gt; ECCURVE[I], H -&amp;gt; ECPOINT[I], I -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
inherit&lt;br /&gt;
ECKEYPARAMETERS [G, H, I]&lt;br /&gt;
feature&lt;br /&gt;
make_q_parameters(q_new: H params_new: ECDOMAINPARAMETERS [G, H, I]) is&lt;br /&gt;
do&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECKEYPAIRGENERATOR [G -&amp;gt; ECCURVE[I], H -&amp;gt; ECPOINT[I], I -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
inherit&lt;br /&gt;
ASYMMETRICCIPHERKEYPAIRGENERATOR [ECKEYGENERATIONPARAMETERS [G, H, I], ECPUBLICKEYPARAMETERS [G, H, I], ECPRIVATEKEYPARAMETERS [G, H, I]]&lt;br /&gt;
ECCONSTANTS&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [G, H, I], ECPRIVATEKEYPARAMETERS [G, H, I]]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Covariants redefinition does not require generic pass-alongs&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
ECCURVE&lt;br /&gt;
feature&lt;br /&gt;
a: ECFIELDELEMENT&lt;br /&gt;
b: ECFIELDELEMENT&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECPUBLICKEYPARAMETERS&lt;br /&gt;
inherit&lt;br /&gt;
ECKEYPARAMETERS&lt;br /&gt;
feature -- Creation procedures&lt;br /&gt;
make_q_parameters(q_new: ECPOINT params_new: ECDOMAINPARAMETERS) is&lt;br /&gt;
do&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECKEYPAIRGENERATOR&lt;br /&gt;
inherit&lt;br /&gt;
ASYMMETRICCIPHERKEYPAIRGENERATOR&lt;br /&gt;
redefine&lt;br /&gt;
pair&lt;br /&gt;
end&lt;br /&gt;
ECCONSTANTS&lt;br /&gt;
feature&lt;br /&gt;
pair: ECKEYPAIR&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	</feed>