扩展通用类型

时间:2016-10-11 13:28:12

标签: java generics extends

我有以下代码:

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

3 个答案:

答案 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)

它不适用,因为TNumber的某个子类型。即它也可以是Double。但是,您可以在构造函数调用中指定T

    public void test()
    {
        GenericsTest<Integer> test = new GenericsTest<>();
        test.doSomething(new Integer(0), new Integer(1)); //Okay now
    }