某些容器类包含基类“Table”的对象列表(如 WoodTable、MetalTable ...)。每个 Table 类都保留其 MaterialType(MaterialType.Wood、MaterialType.Metal...)。问题是如何为可以返回 Table 的每个子类的容器类提供适当的 getter 方法。
到目前为止,我找到了以下方法:
1.以材料类型为参数的Getter。如果 T 的类型不对应于 materialType,这里的危险是 ClassCastException:
<T extends Table> T getTable(MaterialType materialtype)
WoodenTable table = getTable(MaterialType.Wood);
MetalTable table = getTable(MaterialType.Wood); // ups... exception
2.带Class参数的Getter。安全但对用户来说不是很清楚(与作为参数的 MaterialType 相比):
<T extends Table> T getTable(Class<T> tableClass)
WoodenTable table = getTable(WoodenTable.class);
3.每个表子类的Getter。使用繁琐,编写和添加新的表子类:
WoodenTable getWoodenTable()
WoodenTable table = getWoodenTable();
4.Getter for just Table 接口。如有必要,在容器类之外进行强制转换。
Table getTable(MaterialType materialType)
WoodenTable woodenTable = (WoodenTable)getTable(MaterialType.Wood)
还有其他(更好的)方法吗?如果不是,那么其中哪一个最合适或最不臭?