将double传递给接受T的方法

时间:2016-06-06 13:51:34

标签: java generics javafx generic-programming

问题

我正在尝试将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。

2 个答案:

答案 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
        }
    }
}