/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main
(String[] args
) { DocumentRow row = new DocumentRow();
row.setValue(Column.TEXT_VALUE, new DocumentCell<>("asdf"));
row.setValue(Column.NUMERIC_VALUE, new DocumentCell<>(4));
row.
setValue(Column.
DATE_VALUE,
new DocumentCell
<>(new Date()));
String s
= row.
getValue(Column.
TEXT_VALUE); Number i
= row.
getValue(Column.
NUMERIC_VALUE); Date d
= row.
getValue(Column.
DATE_VALUE);
System.
out.
format("%s, %d, %s", s, i ,d
); }
}
class DocumentRow {
private Map<Column<?>, DocumentCell<?>> rowContents = new HashMap<>();
public <U> U getValue(Column<U> column) {
@SuppressWarnings("unchecked")
DocumentCell<U> doc = (DocumentCell<U>) rowContents.get(column);
return doc.getValue(column);
}
public <U> void setValue(Column<U> column, DocumentCell<U> value) {
rowContents.put(column, value);
}
}
class DocumentCell<T> {
private T value;
public DocumentCell(T t){ this.value = t; }
public T getValue(Column<T> c){
return value;
}
}
class Column<T> {
public static final Column
<String
> TEXT_VALUE
= new Column
<>("Text_Column_Name",
String.
class); public static final Column
<Number
> NUMERIC_VALUE
= new Column
<>("Numeric_Column_Name",
Number.
class); public static final Column
<Date
> DATE_VALUE
= new Column
<>("Date_Column_Name",
Date.
class);
Class<T> clazz;
private Column
(String name, Class
<T
> clazz
){ this.name = name;
this.clazz = clazz;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlEb2N1bWVudFJvdyByb3cgPSBuZXcgRG9jdW1lbnRSb3coKTsKCQlyb3cuc2V0VmFsdWUoQ29sdW1uLlRFWFRfVkFMVUUsIG5ldyBEb2N1bWVudENlbGw8PigiYXNkZiIpKTsKCQlyb3cuc2V0VmFsdWUoQ29sdW1uLk5VTUVSSUNfVkFMVUUsIG5ldyBEb2N1bWVudENlbGw8Pig0KSk7CgkJcm93LnNldFZhbHVlKENvbHVtbi5EQVRFX1ZBTFVFLCBuZXcgRG9jdW1lbnRDZWxsPD4obmV3IERhdGUoKSkpOwoJCQoJCVN0cmluZyBzID0gcm93LmdldFZhbHVlKENvbHVtbi5URVhUX1ZBTFVFKTsKCQlOdW1iZXIgaSA9IHJvdy5nZXRWYWx1ZShDb2x1bW4uTlVNRVJJQ19WQUxVRSk7CgkJRGF0ZSBkID0gcm93LmdldFZhbHVlKENvbHVtbi5EQVRFX1ZBTFVFKTsKCQkKCQlTeXN0ZW0ub3V0LmZvcm1hdCgiJXMsICVkLCAlcyIsIHMsIGkgLGQpOwoJfQp9CgpjbGFzcyBEb2N1bWVudFJvdyB7CgogICAgcHJpdmF0ZSBNYXA8Q29sdW1uPD8+LCBEb2N1bWVudENlbGw8Pz4+IHJvd0NvbnRlbnRzID0gbmV3IEhhc2hNYXA8PigpOwoKICAgIHB1YmxpYyA8VT4gVSBnZXRWYWx1ZShDb2x1bW48VT4gY29sdW1uKSB7CiAgICAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCgkJRG9jdW1lbnRDZWxsPFU+IGRvYyA9IChEb2N1bWVudENlbGw8VT4pIHJvd0NvbnRlbnRzLmdldChjb2x1bW4pOwogICAgCXJldHVybiBkb2MuZ2V0VmFsdWUoY29sdW1uKTsKICAgIH0KICAgIAoKICAgIHB1YmxpYyA8VT4gdm9pZCBzZXRWYWx1ZShDb2x1bW48VT4gY29sdW1uLCBEb2N1bWVudENlbGw8VT4gdmFsdWUpIHsKICAgICAgICByb3dDb250ZW50cy5wdXQoY29sdW1uLCB2YWx1ZSk7CiAgICB9Cn0KCmNsYXNzIERvY3VtZW50Q2VsbDxUPiB7CiAgICBwcml2YXRlIFQgdmFsdWU7CiAgICAKICAgIHB1YmxpYyBEb2N1bWVudENlbGwoVCB0KXsgdGhpcy52YWx1ZSA9IHQ7IH0KICAgIAogICAgcHVibGljIFQgZ2V0VmFsdWUoQ29sdW1uPFQ+IGMpewogICAgCXJldHVybiB2YWx1ZTsKICAgIH0KfQoKY2xhc3MgQ29sdW1uPFQ+IHsKCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uPFN0cmluZz4gVEVYVF9WQUxVRSA9IG5ldyBDb2x1bW48PigiVGV4dF9Db2x1bW5fTmFtZSIsIFN0cmluZy5jbGFzcyk7CglwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbjxOdW1iZXI+IE5VTUVSSUNfVkFMVUUgPSBuZXcgQ29sdW1uPD4oIk51bWVyaWNfQ29sdW1uX05hbWUiLCBOdW1iZXIuY2xhc3MpOwoJcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW48RGF0ZT4gREFURV9WQUxVRSA9IG5ldyBDb2x1bW48PigiRGF0ZV9Db2x1bW5fTmFtZSIsIERhdGUuY2xhc3MpOwogICAgCiAgICBTdHJpbmcgbmFtZTsKICAgIENsYXNzPFQ+IGNsYXp6OwogICAgCiAgICBwcml2YXRlIENvbHVtbihTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gY2xhenopewogICAgCXRoaXMubmFtZSA9IG5hbWU7CiAgICAJdGhpcy5jbGF6eiA9IGNsYXp6OwogICAgfQp9