add functional interface
use scala style type parameter