//Attention code Groovy, parce que ca ressemble à Java en plus court !
//Type COLOR, 3 valeurs possibles
enum COLOR {
RED, BLUE, YELLOW
}
// Type Name, une infinité de valeur possibles
class Name {
String value
}
class Name {
String value
//Définition "interne"
Name lordify() {
return new Name(value:'sir ' + this.value)
}
}
class Lordificator {
//Définition "externe"
static Name lordify(Name name) {
return new Name(value:'sir ' + name.value)
}
}
Float in32bit = 6.5f // sur 32 bits
Double in64bit = 6.5 // sur 64 bits
class Person {
//Plus de sens qu'une simple String
//Car on peut de cette façon limiter les opérations faisables
Name name
}
Un système de typage statique pour un langage Turing-Complet doit :
//Ne compile pas
public class Exemple {
static Integer getIntOrZero(Object obj) {
if (obj instanceof Integer) {
return obj;
} else {
return 0;
}
}
}
class Human {}
class Troll extends Human {}
public class Main {
public static void speak(Human h) {
System.out.println("Raconte des choses passionantes");
}
public static void speak(Troll h) {
System.out.println("Emacs c'est nul comparé à vim");
}
public static void main(String[] args) {
Human h = new Troll();
speak(h);
// En Java : la phrase d'humain normal
// En groovy : la phrase de troll
}
}
function makeTheDuckQuack(duck) {
//Ici le type de duck est inconnu,
//On ne le connaitra qu'à l'execution
duck.quack();
}
public Integer castToInt(Number num) {
return (Integer) num;
}
//Le code ci-dessus renvoie une ClassCastException
//si le type de num n'est pas Integer
//Le type de num est donc accessible et vérifié au runtime !
//Java
String explicit = "je suis explicitement une string";
//Scala
val implicit = "je suis implicitement une string"
-- haskell
let add x y = x + y
:info add
-- renvoie add :: Num a => a -> a -> a
-- l'utilisation de + a permis de typer implicitement les paramètres de add
var aNumber = 3;
function add(a, b) {
return a + b;
}
def isNegative(x:Number):Boolean = x.asInstanceOf[Float] < 0.0
interface Point {
x:number
y:number
}
function printPoint(p:Point) {
console.log('('+p.x+','+p.y+')')
}
printPoint({x:1, y:2})
function makeTheDuckQuack(duck) {
duck.quack();
}
class Duck {
quack() {
console.log('coin coin');
}
}
class Unicorn { }
makeTheDuckQuack(new Duck()); //coin coin
var unicorn = new Unicorn();
unicorn.quack = function() { console.log('COIN COIN'); };
makeTheDuckQuack(unicorn); // COIN COIN
makeTheDuckQuack(new Unicorn()); // type error
function display(y : string) {
document.body.innerHTML = y.charAt(0);
// error au runtime: charAt is undefined, pas de check du type au runtime
}
var x : any = 3;
display(x);
Un "type dépendant" est un type dépendant d'une valeur définie
Vect.index 2 [3,4,5] -- renvoit 5
Vect.index 3 [3,4,5] -- ne compile pas
-- [3, 4, 5] est de type Vect 3 Integer