#lang typed/racket (require typed/racket/class) (require [rename-in typed/rackunit [check-equal? test]]) (define node% (class object% (init [with-size : Real]) (define current-size : Real with-size) (define/public (size) current-size) (super-new))) (define empty% (class object% (define/public (size) 0) (super-new))) (ann empty% (Class (size (-> Real)))) ;; more general (define mt% (class object% (define/public (size) 0) (super-new))) (define (m [arg : (Object (size (-> Real)))]) : Real (send arg size)) (test (m (new empty%)) 0) (test (m (new mt%)) 0) (test (m (new node% [with-size 2])) 2)