在没有强制转换的情况下在Java中重载时是否可以限制泛型类型?

时间:2015-02-14 18:20:34

标签: java generics

我有一个定义方法C<T>的泛型类doStuff(T arg)。我想定义一个子类S来重构对doStuff的访问,让我们举一个例子,它必须是Number。我走到这一步:

public class C<T> {

    public void doStuff(T arg) {}

}

public class S<T extends Number> extends C<T> {

    public void doStuff(T arg) {
        Number n = (Number) arg;
    }

}

但是,这意味着我必须在T方法中将Number投射到S。有一种优雅的方法可以避免这种情况吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

所以,有几件事:

  • C<T>未绑定。
  • S<T extends Number>绑定到Number及其子类。

因此,实际上,您已经完成了自己想做的事情。由于T中的S已绑定到Number,因此无需投射。

如果您创建了 C<T> 的其他子类,并在T ...

上定义了边界,那么可以进一步推断它。

public class Q<T extends Date> extends C<T>

public class R<T extends Collection> extends C<T>

...所有这些类的T都会受到extends子句右边任何内容的限制。

答案 1 :(得分:1)

因为T无论如何都是Number的子类,所以你根本不需要进行投射。以你的例子:

public class C<T> {

public void doStuff(T arg) {}

}

public class S<T extends Number> extends C<T> {

    public void doStuff(T arg) {
        System.out.println(arg instanceof Number);
    }

}

doStuff()总是会返回true(arg等于null除外)。

答案 2 :(得分:0)

您可以完全删除广告。

如果它不起作用,泛型将是非常弱的功能。