扩展泛型

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)

如果 TNumber 以及 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));
    }

它不适用,因为 TNumber 的某个子类型。 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() 方法的答案正是这样做的。)