我写过通用方法吗?

时间:2017-10-03 16:47:45

标签: java generics

submitButton.setOnAction(e -> totalPrice(Double.parseDouble(inputText.getText()), spinner.getValue()));

以上语句运行以下方法。检索在gui输入窗口中输入的数值,以及用户设置微调器的数字。

public <E extends Number> void totalPrice(E input, E quantity)
{
    String doubleToString = String.format("$%.2f", input.doubleValue() * quantity.doubleValue());

    outputText.setText(doubleToString);
}

上述方法接受动作的输入并将其转换为字符串。 outputText,即在gui中显示结果的文本字段,设置为字符串。它有效。

我的问题其实很简单。

我写的是真正的通用名吗?赋值指定必须使用泛型,并且第一次,我的代码工作但我很快意识到没有使用泛型。我想我第二次得到它但我可能是非常错的。我需要做出改变吗?任何糟糕的代码?

1 个答案:

答案 0 :(得分:1)

其他人已经在评论中回答了这个问题;只是为了给你一些解释,为什么这是一个通用的方法。

由于您不确定该方法是否为泛型,因此以下是泛型的定义(来自Java Language Specification的摘录):

  

如果方法声明了一个或多个类型变量(§4.4),则该方法是通用的。

     

这些类型变量称为方法的类型参数。泛型方法的类型参数部分的形式与泛型类的类型参数部分(第8.1.2节)相同。

     

泛型方法声明定义了一组方法,每个方法都可以通过类型参数调用类型参数部分。调用泛型方法时,可能不需要显式提供类型参数,因为它们通常可以推断出来(§18(类型推断))。

type parameter这里是E,它代表所有可能的数字类型(short,int,long,float,double,...)。如果您必须在没有泛型的情况下实现该要求,那么您将使用这些不同的参数编写许多方法(因此set of methods)。现在,您只有一个通用方法接受所有可能的数字作为参数。

以下是关于通用方法的官方Java Tutorial

即使从要求中不清楚,我也会修改方法如下:

public <E extends Number> void totalPrice(E input, int quantity) {
    String doubleToString = String.format("$%.2f", input.doubleValue() * quantity);
    outputText.setText(doubleToString);
}

如您所见,我将第二个参数从E更改为int。原因是quantity不是int是没有意义的。但您可以将其保留为E(因为:用户将微调器设置为的任何数字)

因此,正如其他人在评论中已经提到的那样,这是一种语法上有效的通用方法。