将 double 传递给接受 T 的方法

Passing a double to a method that accepts T

问题

我正在尝试将 double 传递给接受 T 的方法。该方法(在这种情况下。我计划添加 String、int 等的情况)要求传递的项目是 double 否则它会抛出一个错误。

基本上,我想将双精度值传递给 commitEdit(T)

背景

我知道我很含糊,所以我会尽量详细说明。我正在尝试创建一个扩展 TableCell<S,T> 的 class,以便我可以通用地使用它。我没有使用 <S,T> 参数的经验。我尝试调用的方法是 commitEdit(T),到目前为止我一直在创建一个扩展 TableCell<CustomRowObject, Double> 的新 class 并且一切正常,因为 commitEdit(Double) 很简单打电话。

问题是,每次我想创建一个新的 table,我都必须创建一个新的单元格 class,我宁愿创建一个通用单元格来处理值的转换从 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)

我很笨

在这个具体案例中,我所要做的就是转换为 T commitEdit( (T) val)

这个有效:

@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) ...
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
        }
    }
}