class A<E>{
}
class B<E> extends A{
}
public class WildInDeclare<E>{
public static void main(String[] args){
A<Integer> obj = new B<Integer>();
}
}
当我编译上面的程序时,我收到了这个错误。
Note: WildInDeclare.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
之后,我只需将class B<E> extends A{
替换为class B<E> extends A<E>{
就可以解释为什么需要再次编写A<E>
在继承过程中使用代码示例请。
我遇到的第二个继承问题。 我使用以下代码更新上面的代码。
class A<E>{
public A(E o){
}
}
class B<E> extends A{
public B(){
super(E);
}
}
public class WildInDeclare<E>{
public static void main(String[] args){
A<Integer> obj = new B<Integer>();
}
}
但它没有编译为什么?我收到了以下错误。
WildInDeclare.java:8: error: cannot find symbol
super(E);
^
symbol: variable E
location: class B<E>
where E is a type-variable:
E extends Object declared in class B
Note: WildInDeclare.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
如何将参数传递给Parent类?
答案 0 :(得分:1)
你能解释为什么需要再次写A
因为A
是一个带有一个类型参数的泛型类。理想情况下,您将无法引用原始类型A
,您只能引用A<String>
或A<Integer>
或A<Map<K, List<O>>
等.Java let您使用原始类型进行向后兼容,但原则上应该强制提供参数。
当您说该课程B
延伸A
时,您仍然需要说出它延伸的A
类型;即通用参数是什么。 (不需要与B
的通用参数相同 - 例如,您可以定义B<E> extends A<String>
并保持一致。)
以下代码......未编译。为什么呢?
该代码在语法上无效。您已经定义了A
的构造函数来获取其泛型参数类型的对象。因此,当您从super()
的构造函数中调用B
时,您需要传入这样的对象。 E
不是对象 - 它只是B的泛型参数的名称。因此,编译器说“无法找到符号”是正确的,范围内没有任何名为E
的内容。
如果你希望B
获取一个只传递给超类构造函数的输入参数,它看起来像这样:
class B<E> extends A<E> {
public B(E e) { // this parameter could be called anything, doesn't have to be e
super(e);
}
}