/* 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);
    
    String name;
    Class<T> clazz;
    
    private Column(String name, Class<T> clazz){
    	this.name = name;
    	this.clazz = clazz;
    }
}