Constrained genericity: Difference between revisions

added Morfa
(added Morfa)
Line 596:
<lang java5>test.<EatableClass>bar();</lang>
The <code>foo</code> method from before can figure out <code>T</code> from its parameter, but this <code>bar</code> method needs to be told what T is.
 
=={{header|Morfa}}==
{{trans|D}}
===Template Version===
<lang morfa>import morfa.type.traits;
 
template < T >
alias IsEdible = HasMember< T, "eat" >;
 
template < T >
if (IsEdible< T >)
struct FoodBox
{
var food: T[];
}
 
struct Carrot
{
func eat(): void {}
}
 
struct Car {}
 
func main(): void
{
var carrotBox: FoodBox< Carrot >; // OK
carrotBox.food ~= Carrot(); // Adds a carrot
 
// var carBox: FoodBox< Car >; // Not allowed
static assert( not trait(compiles, func() { var carBox: FoodBox< Car >; } ));
}</lang>
 
 
===Interface Version===
 
<lang morfa>interface IEdible
{
public func eat(): void;
}
 
template < T >
if (IsBaseOf< T, IEdible >)
struct FoodBox
{
var food: T[];
}
 
class Carrot: IEdible
{
public override func eat(): void {}
}
 
class Car {}
 
func main(): void
{
var carrotBox: FoodBox< Carrot >; // OK
// var carBox: FoodBox< Car >; // Not allowed
static assert( not trait(compiles, func() { var carBox: FoodBox< Car >; } ));
}</lang>
 
=={{header|Nemerle}}==