Generics

class ClassName<T> {
	ClassName(this.val);
	T val = 0;
}

// main
ClassName<int> obj = ClassName(2); 

You can force the type to be a descendent of a certain class

class ClassName<T extends num> {
	ClassName(this.val);
	T val = 0;
}

// main
ClassName<int> obj = ClassName(2);         // allowed
ClassName<String> obj = ClassName('ben'); // not allowed