原始类型传递超级到子

时间:2013-05-31 14:47:07

标签: java generics

根据此报价表格http://www.onjava.com/pub/a/onjava/excerpt/javagenerics_chap05/index.html?page=2

  

每个参数化类型都是相应原始类型的子类型,   所以参数化类型的值可以在原始类型的位置传递   预期。 通常,传递超类型的值是错误的   期望其子类型的值,但Java确实允许a的值   要传递参数化类型的原始类型 - 但是,   它通过生成未经检查的转换来标记这种情况   警告。例如,您可以为a分配类型Stack<E>的值   类型Stack的变量,因为前者是后者的子类型。   您还可以将Stack类型的值分配给类型的变量   Stack<E>,但这会生成未经检查的转化警告。

此代码必须为真

public class Trial 
{
    static void t(Stack<Integer> a )
    {

    }

   public static void main( String[] args ) 
   {
       t( new s());
   }
}

class s{

}
class Stack< T > extends s {
}

t(新s())时出错 我问为什么给我错误,而不是如何解决问题!

2 个答案:

答案 0 :(得分:1)

  

通常,将超类型的值传递给值是错误的   它的子类型是 ,但Java确实允许原始类型的值   在预期参数化类型的地方传递

     

...

     

我问为什么要给我错误,而不是如何解决问题

您收到错误,因为该异常不适用 - 该异常仅适用于将 原始类型 值传递给期望参数化类型的值。 s不是Stack<T>的原始类型; StackStack<T>的原始类型。

您可以传递Stack<T>类型的值,也可以传递带有警告的原始类型Stack的值,但是您无法传递s类型的值,因为它的错误是传递预期子类型的超类型的值,s不是预期类型Stack<T>的原始类型。

答案 1 :(得分:0)

你做不到。没有办法让这段代码工作。您可以通过在方法调用中将s强制转换为Stack来进行编译,但之后它将在运行时失败:

public class Trial 
{
    static void t(Stack<Integer> a )
    {

    }

   public static void main( String[] args ) 
   {
       // Compiles but throws a ClassCastException
       // because an "s" is not a "Stack".
       t((Stack) new s());
   }
}

class s{

}
class Stack< T > extends s {
}