使用Java中的泛型继承

时间:2016-04-07 14:06:51

标签: java generics inheritance

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类?

1 个答案:

答案 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);
    }
}