Generics中的有界类型不用于扩展另一个有界类型

时间:2016-09-11 09:18:19

标签: java generics bounded-types

我正在尝试将有界类型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,但是我收到错误:

enter image description here

我哪里错了?

2 个答案:

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

由于IntegerNumber,但如果您尝试访问ob.a,您会发现它的类型为Number,这不是很有用。