在下面的类的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);
}
答案 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
通用的任何方式使用参数的实现,仅限于与类型的子集一起使用。由于String
,List
和Integer
没有比Object
更具体的公共超类,因此没有这样的使用者可以处理所有三种类型。您可以为每种类型的不同 Consumer
实现,但是对于这些消费者所共有的 金额并没有意义。