Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“通用方法”&引用;绝对值“;JAVA_Java_Methods_Absolute Value - Fatal编程技术网

&引用;“通用方法”&引用;绝对值“;JAVA

&引用;“通用方法”&引用;绝对值“;JAVA,java,methods,absolute-value,Java,Methods,Absolute Value,我想为我的学生们树立一个愚蠢的榜样,但我不知道我是否能做到我所想的 我想用泛型实现abs方法 我的想法与此类似: public class MiMath { public static <T extends Number> T abs(T objeto) { if (objeto.doubleValue()<0) return (T) -objeto.doubleValue(); else return objeto;

我想为我的学生们树立一个愚蠢的榜样,但我不知道我是否能做到我所想的

我想用泛型实现abs方法

我的想法与此类似:

public class MiMath {
  public static <T extends Number> T abs(T objeto) {
    if (objeto.doubleValue()<0)
        return (T) -objeto.doubleValue();
    else
        return  objeto;
  }
}
eclipse说(T)不是一个类型,泛型信息(T)只在编译时存在,编译后被丢弃


因此,您永远不能在运行时强制转换为泛型,这就是您的return语句所做的。

您的动机是返回一个与调用它的对象类型相同的对象

不幸的是,泛型在这方面帮不了你。在线上

return (T) -objeto.doubleValue();
你必须说

return new T(-objecto.doubleValue());
但这是行不通的,因为t在编译时是未知的,所以必须在编译时做出决定

获得类似结果的一种方法是使用一个界面,但其优雅程度要低得多

public interface AbsEvaluator<N extends Number> {
    N abs(N n);
}
公共接口评估器{
N abs(N);
}
并且有如下实现

AbsEvaluator<Integer> intAbs = 
  new AbsEvaluator<Integer>() { public Integer abs(Integer n) { return -n; }};
AbsEvaluator intab=
新的AbsEvaluator(){public Integer abs(Integer n){return-n;}};
每种类型的实现都完全相同,因此该方案相当薄弱

依赖于您正在寻找的类型推断的好例子是高阶函数(当然,Java没有一级函数,所以您必须使用一种方法接口对它们进行建模)。那么你就可以,比如说

<T,U,V> Function<T, V> compose(Function<U, V> g, Function<T, U> f);
函数组合(函数g、函数f);

不完全是初学者的东西,特别是当还显示了实现时,但它可能适合您的课程。请注意,当Java 8发布时,这类内容将变得非常突出。

问题是,您在这里使用(T)所做的不是真正的强制转换,而是在幕后使用自动装箱并调用T.valueOf()——泛型不知道这一点


作为泛型的一个好例子,您最好使用集合之类的东西(因为它们也是人们最有可能使用它们的地方)。

这不是演示泛型的好方法。这是纯多态性。这里不需要泛型,
doubleValue()
Number
上的虚拟方法
abs(Number obj)
会做得很好。问题是,如果我传入一个
BigDecimal
您正在使用它的
doubleValue()
并返回一个
Double
。您将获得一个类型
T
,但返回一个
Double
。你可以尝试将它转换为
(T)
,这显然是
类castexception
。您可以在Java 7中转换为泛型类型-您显然使用的是早期版本-但这对您没有帮助。我们需要一个新标记[teacher looking help];)我不确定你是否应该教泛型。这是错误的。这在Java7中是可能的。
<T,U,V> Function<T, V> compose(Function<U, V> g, Function<T, U> f);