根据此报价表格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())时出错 我问为什么给我错误,而不是如何解决问题!
答案 0 :(得分:1)
通常,将超类型的值传递给值是错误的 它的子类型是 ,但Java确实允许原始类型的值 在预期参数化类型的地方传递
...
我问为什么要给我错误,而不是如何解决问题
您收到错误,因为该异常不适用 - 该异常仅适用于将 原始类型 值传递给期望参数化类型的值。 s
不是Stack<T>
的原始类型; Stack
是Stack<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 {
}