Java 扩展泛型类型

Java 扩展泛型类型,java,generics,extends,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

我有以下代码:

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
    }
}
公共类泛型测试{
公共无效剂量测定(T v1,T v2){
}
公开无效测试()
{
GenericsTest=新的GenericsTest();
//测试。doSomething(新整数(0)、新整数(1));不正常
}
}
test()

类型GenericsTest中的doSomething(T,T)方法不可用 适用于参数(整数、整数)


如果
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
}
publicstaticvoidmain(字符串[]args){
最终GenericsTest=新的GenericsTest();
test.doSomething(新整数(0),新整数(1));//现在可以了
}
然后您需要向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));
    }
public void doSomething(T v1,T v2){
}
公共void testMethod(){
最终GenericsTest=新的GenericsTest();
测试剂量(新整数(0),新整数(1));
}

它不适用,因为
T
Number
的某些子类型。也就是说,它可以是
Double
。但是,您可以在构造函数调用时指定
T

    public void test()
    {
        GenericsTest<Integer> test = new GenericsTest<>();
        test.doSomething(new Integer(0), new Integer(1)); //Okay now
    }
公共无效测试()
{
GenericsTest=新的GenericsTest();
test.doSomething(新整数(0),新整数(1));//现在可以了
}

正如建议的那样,我将尝试用一个反例来说明问题:

由于
test()
方法在泛型类中,因此方法中使用的
T
参数是类的参数。这意味着,
new GenericTest().test()
将在内部创建一个
GenericTest
,而
new GenericTest().test()
将在内部创建一个漂亮的
GenericTest
。由于在编译时还不清楚将使用
T
参数的具体类型,当
Integer
等具体类型与
GenericTest
对象一起使用时,编译器会引发错误,该对象是在
test()
方法中创建的

test()
方法中调用
newgenerictest()
是非常好的,但是仍然有点混乱。这就是为什么我会建议将这些测试方法放在课堂之外,在课堂之外,这些事情会立即变得清晰


(将测试代码移动到
main()
方法的答案正好如此。)

您的测试方法不应在同一类中。如何调用test()?这是因为变量
test
GenericsTest
而不是
GenericsTest
@FlorianAlbrecht,我想这并不重要。他可以完美地编写这样的代码,因为除了向他展示它的工作原理之外,它实际上并不打算做任何事情,很明显整数是无效的。@FlorianAlbrecht你是对的:)我没有想到编译器会接受这个例子,因为已知一个
T
。不幸的是,这不是我要问的答案。