将 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
}
}
}
问题
我正在尝试将 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
}
}
}