我有以下代码:
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
, 但我不能传递任何数字。
The method doSomething(T, T) in the type GenericsTest is not applicable for the arguments (Integer, Integer)
为什么我不能通过 Integer
如果T
是Number
以及Integer
?
最佳答案
如建议的那样,我将尝试通过反例使事情更清楚:
作为 test()
方法在泛型类中,T
方法内部使用的参数是类的参数。这意味着,new GenericTest<Double>().test()
会创建一个 GenericTest<Double>
在里面,同时一个new GenericTest<Integer>().test()
会创造一个很好的GenericTest<Integer>
里面。在编译时,尚不清楚 T
的具体类型。将使用参数,编译器在具体类型如 Integer
时引发错误与 GenericTest<T>
一起使用在 test()
中创建的对象方法。
调用 new GenericTest<Integer>()
就好了在 test()
内方法,但仍然有点困惑。这就是为什么我会建议将此类测试方法放在类之外,这样事情就会立即变得清晰起来。
(将测试代码移至 main()
方法的答案正是这样做的。)
关于java - 扩展泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978389/