[英]Bounded type in Generics not working on extending another bounded type
我试图扩展有界类型T2以使用T1,如下面的代码所示:
class TestMultiBoundedTypes<T1 extends Number, T2 extends T1>{
T1 a;
T2 b;
void set(T1 x, T2 y)
{
a = x;
b = y;
}
T1 getNum1()
{
return a;
}
T2 getNum2()
{
return b;
}
}
class MultiBoundedTypes
{
public static void main(String args[])
{
TestMultiBoundedTypes<Integer, Double> ob = new TestMultiBoundedTypes<Integer, Double>();
ob.set(new Integer(5), new Double(5.23));
System.out.println("Number1 = "+ob.getNum1());
System.out.println("Number2 = "+ob.getNum2());
}
}
由于我已经使有界类型T2扩展了有界类型T1,因此我希望T2接受任何类型的数字或Number的任何子类。 我已将Double类传递给T2,但是我收到错误:
我哪里错了?
由于我已经使有界类型T2扩展了有界类型T1,因此我希望T2接受任何类型的数字或Number的任何子类。
错误的假设。 为了获得此行为,您应将其声明为:
class TestMultiBoundedTypes<T1 extends Number, T2 extends Number>
随着你原来的申报TestMultiBoundedTypes
,如果你传递一个Integer
作为第一类,第二类必须是Integer
或子类型的Integer
(而且由于Integer
是最终的,这意味着它必须是Integer
)。
因此
TestMultiBoundedTypes<Integer, Integer> ob = new TestMultiBoundedTypes<Integer, Integer>();
会通过编译,但是
TestMultiBoundedTypes<Integer, Double> ob = new TestMultiBoundedTypes<Integer, Double>();
不会。
“T2扩展T1”意味着T2必须是与T1相同的类型,或者是从T1派生的类型。 (比T1更受限制。)但Double
不是从Integer
派生的。 这就是你出错的地方。
你可以试试
TestMultiBoundedTypes<Number,Double> ob = new TestMultiBoundedTypes<>();
因为Double
是从Number
派生的,然后你仍然可以
ob.set( new Integer( 5 ), new Double( 5.23 ) );
因为Integer
是一个Number
,但是如果你试图访问ob.a
你会注意到它的类型是Number
,这不是很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.