在 Java 中重载而不强制转换时是否可以限制泛型类型?

Is it possible to restrict generic types when overloading in Java without casting?

我有一个泛型 class C<T> 定义了一个方法 doStuff(T arg)。我想定义一个 subclass 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;
    }

}

然而,这意味着我必须在我的 S 方法中将 T 转换为 Number。有没有一种优雅的方法可以避免这种情况?

谢谢!

您可以完全删除铸件。

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

所以,有几件事:

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

所以,实际上,你已经完成了你想做的事情。转换是不必要的,因为 S 中的 T 已经绑定到 Number.

进一步推断,如果您创建了 C<T> 的其他子 类,并在其中定义了 T 的边界...

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

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

...所有这些 类 的 T 都将受到 extends 子句右侧任何内容的约束。

因为 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() 将始终 return 为真(除了 arg 等于 null)。