我正在尝试将有界类型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,但是我收到错误:
我哪里错了?
答案 0 :(得分:0)
由于我已经使有界类型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>();
不会。
答案 1 :(得分:0)
“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
,这不是很有用。