繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM