我想为我的学生做一个愚蠢的例子,但不知道我能不能做我想的事情
我想用泛型做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
答案 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语句所做的。