java - java泛型方法如何约束方法类型参数?

标签 java generics

我一直在阅读泛型方法,并认为我理解泛型类型参数如何限制方法参数类型,但是当我用实际代码测试一些想法时,我得到了意想不到的结果。这是一个我不明白的简单通用方法:

private static <T> void foo(T[] t1, T[] t2){  
    t2[0] = t1[0];
}
...
String[] stringArray = new String[]{"1", "2", "3"};
Integer[] integerArray = new Integer[]{4,5,6};
foo(stringArray, integerArray);

我原以为这个泛型方法受到约束,因此两个数组必须是同一类型 T,但实际上上面的代码编译得很好,即使一个数组是 String 类型而另一个是输入整数。程序运行时会产生运行时异常(ArrayStoreException)。

最佳答案

在这个例子中,推断类型是 ?扩展 Object[],它适合这两种类型。

为了实现你想要的,你需要:

private static <T> void foo(Class<T> clazz, T[] t1, T[] t2);

然后

foo(String.class, stringArray, stringArray); // compiles
foo(String.class, stringArray, integerArray); // fails

关于java - java泛型方法如何约束方法类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4139082/

相关文章:

java - 我们可以使用 javassist 向现有类添加非原始字段吗?

C# Xml 序列化 List<T> 具有 Xml 属性的后代

scala - 推断抽象类中的多个泛型类型,这些类型应该可供编译器使用

c++ - 模板基类的子类的模板特化

java.lang.UnsupportedOperationException : org. hibernate.dialect.Oracle10gDialect 不支持通过存储过程的结果集

java - 创建具有固定列数的动态数组

java - 我想使用 twitter 给出的 URL 来获取 JSON 文件?

java - 使用通用通配符代替接口(interface)

c# - 参数化一个通用接口(interface) - 创建一个 Dictionary<Type, Interface<T>>?

java - 无法在 Derby 数据库中找到表