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
。不幸的是,这不是我要问的答案。