我想使用泛型类型来确保方法的参数具有相同的类型,如下所示:
public static <T> void x(T a, T b)
我假设传递给此方法的两个参数(a和b)必须始终属于同一类型。但令我惊讶的是,我能够将任何类型的参数(甚至是基本类型)传递给方法x,就好像T被擦除为Object一样,而不管传递的是什么参数。
到目前为止,我发现的唯一变通办法是像这样使用“扩展”:
public static <T, U extends T> void x(T a, U b)
但是,尽管我可以接受它,但它不是我想要的。
有没有办法使用泛型类型来强制一个方法的所有参数的类型?
发布于 2015-05-14 11:27:59
如果我没理解错你的问题,你想要的是:
x(10, "x");
在编译时失败。现在考虑这样做:
Integer i = 10;
String s = "x";
Object o1 = i;
Object o2 = s;
x(o1, o2);
在这种情况下,它们都是对象-相同的类型。我不认为有任何方法可以真正执行你想要的东西-当你将你的参数转换为Object时,总是可以用两种不同的类型调用它,而不会出现任何警告/错误。
您可以像这样使用它来指定要使用的类型:
ClassName.<Type>x(obj1, obj2);
这是唯一可行的方法。
发布于 2015-05-13 22:13:56
如果我理解正确的话,一种方法是explicitly specify the type of 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) {
}
}
发布于 2015-05-13 22:14:53
您可能没有以泛型方式调用泛型方法,因此它被视为对x(Object a, Object b)
的调用。在此示例中:
public class Test {
static <T> void x(T a, T b) {
}
public static void main(String[] args) {
x(1, 2); // compiles
Test.<String>x(1, 2); // does not compile
Test.<String>x("a", "b"); // compiles
}
}
对x的第一个调用不是泛型的,所以它会编译。第二个调用将T
等同于String
,因此它失败了,因为1
和2
不是Strings
。第三个调用会编译,因为它正确地传入了Strings
。
https://stackoverflow.com/questions/30217236
复制相似问题