泛型实例化和 Lambdas
Generic type instantiation and Lambdas
我正在使用匿名函数和函数接口,我有一个函数接口接受两个相同类型的对象,returns true 或 false。
package elementutils;
@FunctionalInterface
public interface TwoElementPredicate <T> {
public boolean compare(T a, T b);
}
我在另一个 class 中使用函数接口来获取 "better element" 使用匿名函数,方法 betterElement 采用两个对象和函数接口的实例。然后我应该能够创建 lambdas 来比较主体中相同类型的两个对象。
package elementutils;
public class ElementUtils <T> {
public T betterElement(T a, T b, TwoElementPredicate elements){
if (elements.compare(a, b) == true) {
return a;
}else {
return b;
}
}
public static void main(String[] args) {
//String x= ElementUtils.betterElement("java", "python", (a, b) -> a.length() < b.length());
//int y= ElementUtils.betterElement(2, 3, (a, b) -> a > b);
//double z= ElementUtils.betterElement(2.5, 3.7, (a, b) -> a > b);
// all this give errors
}
}
函数应该接受任何对象,只要它们来自同一类型。我以为我可以使用泛型 classes 实现这一点,但是当我实例化 lambda 时,元素似乎总是对象类型,所以我不能使用 length() 并且不能将它们分配给 String 例如。
希望我的解释正确,如有任何帮助,我们将不胜感激。
您在 TwoElementPredicate
上缺少类型参数 T
,因此您使用的是 原始类型
您需要将参数 elements
声明为类型 TwoElementPredicate<T>
您对 betterElement
的定义使用原始 TwoElementPredicate
,因此其参数将始终为 Object
。相反,您应该使用通用参数,具有与元素相同的 T
:
public T betterElement(T a, T b, TwoElementPredicate<T> elements) {
// Here ----------------------------------------^
我正在使用匿名函数和函数接口,我有一个函数接口接受两个相同类型的对象,returns true 或 false。
package elementutils;
@FunctionalInterface
public interface TwoElementPredicate <T> {
public boolean compare(T a, T b);
}
我在另一个 class 中使用函数接口来获取 "better element" 使用匿名函数,方法 betterElement 采用两个对象和函数接口的实例。然后我应该能够创建 lambdas 来比较主体中相同类型的两个对象。
package elementutils;
public class ElementUtils <T> {
public T betterElement(T a, T b, TwoElementPredicate elements){
if (elements.compare(a, b) == true) {
return a;
}else {
return b;
}
}
public static void main(String[] args) {
//String x= ElementUtils.betterElement("java", "python", (a, b) -> a.length() < b.length());
//int y= ElementUtils.betterElement(2, 3, (a, b) -> a > b);
//double z= ElementUtils.betterElement(2.5, 3.7, (a, b) -> a > b);
// all this give errors
}
}
函数应该接受任何对象,只要它们来自同一类型。我以为我可以使用泛型 classes 实现这一点,但是当我实例化 lambda 时,元素似乎总是对象类型,所以我不能使用 length() 并且不能将它们分配给 String 例如。
希望我的解释正确,如有任何帮助,我们将不胜感激。
您在 TwoElementPredicate
上缺少类型参数 T
,因此您使用的是 原始类型
您需要将参数 elements
声明为类型 TwoElementPredicate<T>
您对 betterElement
的定义使用原始 TwoElementPredicate
,因此其参数将始终为 Object
。相反,您应该使用通用参数,具有与元素相同的 T
:
public T betterElement(T a, T b, TwoElementPredicate<T> elements) {
// Here ----------------------------------------^