我有以下代码:
public class GenericsTest<T extends Number> {
public void doSomething(T v1, T v2) {
}
public void test()
{
GenericsTest<T> test = new GenericsTest<>();
//test.doSomething(new Integer(0), new Integer(1)); Not ok
}
}
在test()
我创建了GenericsTest<T>
T
扩展Number
,但我无法传递任何数字。
GenericsTest类型中的方法doSomething(T,T)不是 适用于参数(整数,整数)
如果Integer
T
以及Number
,我为什么无法传递Integer
?
答案 0 :(得分:3)
您需要使用有效类型
定义通用实例public static void main(String[] args) {
final GenericsTest<Integer> test = new GenericsTest<>();
test.doSomething(new Integer(0), new Integer(1)); // now is ok
}
然后你需要为方法doSomething
添加约束 public <T extends Number> void doSomething(T v1, T v2) {
}
public void testMethod() {
final GenericsTest<T> test = new GenericsTest<>();
test.doSomething(new Integer(0), new Integer(1));
}
答案 1 :(得分:3)
与建议一样,我会尝试用反例来说明事情:
由于test()
方法在泛型类中,因此方法中使用的T
参数是类的参数。这意味着,new GenericTest<Double>().test()
会在内部创建GenericTest<Double>
,而new GenericTest<Integer>().test()
会在内部创建一个不错的GenericTest<Integer>
。在编译时,不清楚将使用T
参数的具体类型,当Integer
等具体类型与在GenericTest<T>
内创建的test()
对象一起使用时,编译器会引发错误。 new GenericTest<Integer>()
方法。
在test()
方法中调用main()
会非常好,但仍然有点令人困惑。这就是为什么我建议将这些测试方法放在课外,这样的事情会立即变得清晰。
(将测试代码移动到{{1}}方法的答案就是这样。)
答案 2 :(得分:2)
它不适用,因为T
是Number
的某个子类型。即它也可以是Double
。但是,您可以在构造函数调用中指定T
:
public void test()
{
GenericsTest<Integer> test = new GenericsTest<>();
test.doSomething(new Integer(0), new Integer(1)); //Okay now
}