“泛型方法”“绝对值”java

时间:2014-02-14 10:42:47

标签: 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;
  }
}

在这个linea

return (T) -objeto.doubleValue(); 
eclipse说(T)不是Type

3 个答案:

答案 0 :(得分:1)

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

不幸的是,Generics无法帮助你。在你的行上

return (T) -objeto.doubleValue();

你实际上必须说

return new T(-objecto.doubleValue());

但是这不起作用,因为在编译时不知道T,那就是必须做出关于它的决定。

获得类似结果的方法,但是不那么优雅,就是拥有一个界面

public interface AbsEvaluator<N extends Number> {
    N abs(N n);
}

并具有类似

的实现
AbsEvaluator<Integer> intAbs = 
  new AbsEvaluator<Integer>() { public Integer abs(Integer n) { return -n; }};

每种类型的实现都完全相同,因此该方案非常薄弱。

依赖于您正在寻找的类型推断的好例子是高阶函数(当然,Java没有一流函数,因此您必须使用单方法接口对它们进行建模)。然后你可以,例如,

<T,U,V> Function<T, V> compose(Function<U, V> g, Function<T, U> f);

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

答案 1 :(得分:1)

问题是你在这里用(T)做的事情并不是真正的演员,在幕后它使用自动装箱并调用T.valueOf() - 这是泛型不知道的。

对于泛型的一个很好的例子,你最好使用像集合这样的东西(因为它们也是人们最有可能使用它们的地方)。

答案 2 :(得分:-1)

泛型信息(T)仅在编译时存在,并在编译后被丢弃。

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