泛型Java方法的泛型是否可以用来强制参数的类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我想使用泛型类型来确保方法的参数具有相同的类型,如下所示:

public static <T> void x(T a, T b)

我假设传递给这个方法的两个参数(a和b)总是必须是相同的类型。但令我惊讶的是,我能够将任何类型的参数(甚至是基元)传递给方法x,就好像T被擦除为Object,而不管传递了什么参数。

到目前为止,我发现的唯一解决方法是使用像这样的'extends':

public static <T, U extends T> void x(T a, U b)

但尽管我能忍受它,但这不是我想要的。

有没有办法使用泛型来强制方法的所有参数的类型?

提问于
用户回答回答于

如果我正确理解你的问题,你需要这样做:

x(10, "x");

在编译时失败。现在考虑这样做:

Integer i = 10;
String s = "x";
Object o1 = i;
Object o2 = s;
x(o1, o2);

在这种情况下,它们都是对象 - 相同类型。我不认为有什么办法可以真正实现你想要的东西 - 当你将参数转换为Object时,总是可以用两种不同的类型调用它,而不会有任何警告/错误。

你可以像这样使用它来指定你想要使用的类型:

ClassName.<Type>x(obj1, obj2);

而且它可以成为唯一的方法。

用户回答回答于

如果我理解正确,一种方法是明确地指定T的类型,而不是让编译器推断它的类型是最直接的超类,在两个不同类型的对象作为参数传入的情况下。采取这样的事情,例如:

public class Test {
    public static void main(String[] args) {
        Test.x(5.0, 5);          // This works since type is inferred to be Number
        Test.<Integer>x(5, 5);   // This works since type is stated to be Integer
        Test.<Integer>x(5.0, 5); // This doesn't; type is stated to be Integer and Double is passed in
    }

    public static <T> void x(T a, T b) {
    }
}

扫码关注云+社区