class X<T> {
T x;
X(T x) { this.x = x; }
public String toString() {
var s = new StringBuilder();
var f = new Formatter(s);
f.format("%s", getClass().getName());
f.format("<%s>", x.getClass().getName());
f.format("@%x", hashCode());
f.flush();
return s.toString();
}
}
X<?> x = new X<>(123);
out.println(x);
package Point {
my $_data = {};
sub new {
my $class = shift;
$_data = { @_ };
bless $_data, $class;
};
use overload '""' => sub { shift->_stringify() };
sub _stringify {
my $self = shift;
return sprintf 'A point at (%d, %d)', $self->{x}, $self->{y};
}
}
my $p = Point->new(x => 5, y => 10);
print $p;