问题
我正在尝试将double传递给接受T的方法。该方法(在本例中。我计划为String,int等添加案例)要求传递的项为double,否则它将抛出错误。
基本上,我想将一个双精度传递给commitEdit(T)
。
背景
我知道我很模糊,所以我会试着详细说明。我正在尝试创建一个扩展TableCell<S,T>
的类,以便我可以一般地使用它。我没有使用<S,T>
参数的经验。我试图调用的方法是commitEdit(T)
,到目前为止,我一直在创建一个扩展TableCell<CustomRowObject, Double>
的新类,一切都运行正常,因为commitEdit(Double)
很容易调用。< / p>
问题在于,每次我想创建一个新表时,我都必须创建一个新的单元类,我宁愿创建一个通用单元来处理从Object到Double,String,Integer的值的转换,等,并将其传递给commitEdit(T)
。
在我多年的编程中,我一直试图避免泛型论点,但现在我认为这是一个学习的好时机。
代码
这是我到目前为止提出的commitEdit(T)
包装器的一个示例(不起作用)
public static class EditingCell<S, T> extends TableCell<S, T> {
public EditingCell() {
}
public void commit(Object val) {
if(val instanceof Double) {
commitEdit((Double) val);
} else if(val instanceof String) {
commitEdit((String) val);
}
}
}
The method commitEdit(T) in the type TableCell<S,T> is not applicable for the arguments (double)
Im Dumb
正如在这个特定情况下,我所要做的就是将commitEdit( (T) val)
转换为T。
答案 0 :(得分:4)
这有效:
@Test
public void testDoubleGeneric()
{
commitEdit(3.1514D);
}
private <T> void commitEdit(final T value)
{
if (!(value instanceof Double))
{
throw new IllegalArgumentException();
}
}
但是,我认为,使用泛型的方法不是解决问题的正确方法。每当您必须使用instanceof
时,泛型不是解决方案。请考虑方法重载。
public void commit(Double d) ...
public void commit(String str) ...
答案 1 :(得分:0)
public class Example extends TableCell {
public <T> void commit(T value) {
if(arg instanceof Double) {
// do whatever
} else if(arg instanceof String) {
// do something else
}
}
}