使用者接口中的Java通用类型参数

时间:2018-06-21 04:29:42

标签: java syntax compiler-errors generic-programming

在下面的类的main方法中,使用以下方法:input。

但是,这将导致编译错误,如下面的用法所示,包装在使用者中的字段数量是Object的实例,而不是可以成型为int的泛型类型。

因此,要解决编译错误,我们需要将(int)转换为数量,然后使用ok((int)amount);

public class Constructor {

public static void main(String.... args) {
    input("reason", (amount) -> {
        int amount2 = amount; //also error as amount is Object and not int
        ok(amount); //error as amount is Object and not int
    });
}

public static void ok(int i){ //paramter i MUST BE INTEGER

}

public static <T> void input(String reason, Consumer<T> answer){

}
}

我希望能够自由使用消费者中的金额值作为int / string / list

这里有一个我想如何免费使用金额字段的示例:

usage:
ok(attribute("key"); //this will work and is freely moldable into int/string/whatever

code:
public <T> T attribute(String key){ //This will return whatever you want it to, and is how I want the amount field to do inside the consumer
    return aHashMap.get(key);
}

1 个答案:

答案 0 :(得分:0)

此处最接近的问题是Java编译器没有依据来推断方法T的类型参数input()的基础。您可以通过使用多种明确表达方式来解决此问题。例如,

 <Integer>input("reason", (amount) -> {
    int amount2 = amount; //also error as amount is Object and not int
    ok(amount); //error as amount is Object and not int
 });

Consumer<Integer> intConsumer = (amount) -> {
    int amount2 = amount; //also error as amount is Object and not int
    ok(amount); //error as amount is Object and not int
};

input("reason", intConsumer);

另一方面,您不清楚在那里使用通用方法所获得的价值。另一种选择是用不同的方式声明它:

public static void input(String reason, Consumer<Integer> answer){
    // ...
}

如果您不希望input()指定Consumer的type参数,那么也许您想要

public static void input(String reason, Consumer<?> answer){
    // ...
}

,尽管它本身并不能帮助Java推断调用该方法的Consumer的类型参数。

  

我希望能够自由使用消费者中的金额值作为int / string / list

如上所述,这没有任何意义。 amount的实现中存在局部变量Consumer是该实现的细节。因此,以并非对所有Object通用的任何方式使用参数的实现,仅限于与类型的子集一起使用。由于StringListInteger没有比Object更具体的公共超类,因此没有这样的使用者可以处理所有三种类型。您可以为每种类型的不同 Consumer实现,但是对于这些消费者所共有的 金额并没有意义。