“通用方法”,“绝对值”的java(“generic method” “absolute value

2019-09-29 15:34发布

我想打一个愚蠢的例子为我的学生,但鸵鸟政策知道如果我可以做什么I'm思考

我想要做仿制药的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(); 

蚀说,(T)是不是一个类型

Answer 1:

问题是,你与(T)在这里做是不是一个真正的演员,幕后是使用自动装箱并调用T.valueOf() - 其仿制药不知道。

对于仿制药的一个很好的例子,你好得多使用像集合(因为他们也是地方的人最有可能使用它们)。



Answer 2:

你的动机是返还相同种类的一个,它被称为用的对象。

不幸的是,仿制药不能帮助你。 您的线路

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得到释放这种东西就会变得非常突出。



Answer 3:

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

因此,你不能转换为通用在运行时,这是你的return语句做什么。



文章来源: “generic method” “absolute value” java