首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >泛型Java方法的泛型类型能否用于强制参数类型?

泛型Java方法的泛型类型能否用于强制参数类型?
EN

Stack Overflow用户
提问于 2015-05-13 22:03:31
回答 4查看 4K关注 0票数 54

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

代码语言:javascript
复制
public static <T> void x(T a, T b)

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

到目前为止,我发现的唯一变通办法是像这样使用“扩展”:

代码语言:javascript
复制
public static <T, U extends T> void x(T a, U b)

但是,尽管我可以接受它,但它不是我想要的。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-14 11:27:59

如果我没理解错你的问题,你想要的是:

代码语言:javascript
复制
x(10, "x");

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

代码语言:javascript
复制
Integer i = 10;
String s = "x";
Object o1 = i;
Object o2 = s;
x(o1, o2);

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

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

代码语言:javascript
复制
ClassName.<Type>x(obj1, obj2);

这是唯一可行的方法。

票数 21
EN

Stack Overflow用户

发布于 2015-05-13 22:13:56

如果我理解正确的话,一种方法是explicitly specify the type of T,而不是让编译器在两个不同类型的对象作为参数传递的情况下推断它的类型是最直接的超类。以下面的内容为例:

代码语言:javascript
复制
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) {
    }
}
票数 29
EN

Stack Overflow用户

发布于 2015-05-13 22:14:53

您可能没有以泛型方式调用泛型方法,因此它被视为对x(Object a, Object b)的调用。在此示例中:

代码语言:javascript
复制
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,因此它失败了,因为12不是Strings。第三个调用会编译,因为它正确地传入了Strings

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30217236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档