#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)