扩展泛型
Extended generic type
我有以下代码:
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)
如果 T
是 Number
以及 Integer
,为什么我不能传递 Integer
?
您需要定义具有有效类型的泛型实例
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));
}
它不适用,因为 T
是 Number
的某个子类型。 IE。也可以是 Double
。但是,您可以在构造函数调用时指定 T
:
public void test()
{
GenericsTest<Integer> test = new GenericsTest<>();
test.doSomething(new Integer(0), new Integer(1)); //Okay now
}
如建议的那样,我将尝试用反例使事情更清楚:
由于test()
方法在泛型class内部,所以方法内部使用的T
参数是class的参数。这意味着,new GenericTest<Double>().test()
会在内部创建一个 GenericTest<Double>
,而 new GenericTest<Integer>().test()
会在内部创建一个漂亮的 GenericTest<Integer>
。由于在编译时不清楚将使用 T
参数的具体类型,当 Integer
等具体类型与在内部创建的 GenericTest<T>
对象一起使用时,编译器会引发错误test()
方法。
在 test()
方法中调用 new GenericTest<Integer>()
会很好,但仍然有点混乱。这就是为什么我会建议将此类测试方法放在 class 之外,这样事情就会立即变得清晰。
(将测试代码移至 main()
方法的答案正是这样做的。)
我有以下代码:
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)
如果 T
是 Number
以及 Integer
,为什么我不能传递 Integer
?
您需要定义具有有效类型的泛型实例
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));
}
它不适用,因为 T
是 Number
的某个子类型。 IE。也可以是 Double
。但是,您可以在构造函数调用时指定 T
:
public void test()
{
GenericsTest<Integer> test = new GenericsTest<>();
test.doSomething(new Integer(0), new Integer(1)); //Okay now
}
如建议的那样,我将尝试用反例使事情更清楚:
由于test()
方法在泛型class内部,所以方法内部使用的T
参数是class的参数。这意味着,new GenericTest<Double>().test()
会在内部创建一个 GenericTest<Double>
,而 new GenericTest<Integer>().test()
会在内部创建一个漂亮的 GenericTest<Integer>
。由于在编译时不清楚将使用 T
参数的具体类型,当 Integer
等具体类型与在内部创建的 GenericTest<T>
对象一起使用时,编译器会引发错误test()
方法。
在 test()
方法中调用 new GenericTest<Integer>()
会很好,但仍然有点混乱。这就是为什么我会建议将此类测试方法放在 class 之外,这样事情就会立即变得清晰。
(将测试代码移至 main()
方法的答案正是这样做的。)