我想打一个愚蠢的例子为我的学生,但鸵鸟政策知道如果我可以做什么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)是不是一个类型
问题是,你与(T)在这里做是不是一个真正的演员,幕后是使用自动装箱并调用T.valueOf() - 其仿制药不知道。
对于仿制药的一个很好的例子,你好得多使用像集合(因为他们也是地方的人最有可能使用它们)。
你的动机是返还相同种类的一个,它被称为用的对象。
不幸的是,仿制药不能帮助你。 您的线路
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得到释放这种东西就会变得非常突出。
泛型信息(T)只在编译时存在,并且编译之后被丢弃。
因此,你不能转换为通用在运行时,这是你的return语句做什么。