0

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

每个参数化类型都是相应原始类型的子类型,因此可以在需要原始类型的地方传递参数化类型的值。通常,在期望其子类型的值的地方传递超类型的值是错误的,但是 Java 确实允许在期望参数化类型的地方传递原始类型的值——但是, 它通过生成来标记这种情况未经检查的转换警告。例如,您可以将 type 的值分配给 typeStack<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(new s());处的错误; 我在问为什么给我错误,而不是如何解决问题!

4

2 回答 2

1

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

...

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

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

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

于 2013-05-31T15:25:03.923 回答
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 {
}
于 2013-05-31T15:21:37.517 回答