Java base作为模板参数

时间:2017-08-12 18:52:00

标签: java generics inheritance

我是半熟的Java,并且在Groovy中尝试过。

Groovy / Java中是否存在以下内容:

public class A {
}
public class B {
}

public class C<Ta extends A, Tb extends B> extends Ta {
   public Ta[] bArray;
   public Tb[] getAllBs()
   {
      Tb[] ret = new Tb[0];
      ....
      return ret;
   }
}

以上定义不显示任何错误。但是当我尝试使用C作为另一种类型的基类时,我收到一个错误:

public class DummyA extends A {};
public class DummyB extends B {};

public class D extends C<DummyA, DummyB> {
}

以上定义显示错误'D类型的层次结构不一致'。

如果我将C重新定义为以下任何一项,则错误消失:

//remove the base class, Ta, from C
public class C<Ta extends A, Tb extends B> {
....
}

(或)

//Use the class A, instead of generic type Ta, as base class
public class C<Ta extends A, Tb extends B> extends A {
....
}

我必须打破一些Java规则,但无法识别

2 个答案:

答案 0 :(得分:0)

这是不可能的,因为D的超类的超类是“通用的” 并且不允许使用通用的超级类型!这是允许的:

public class C<B extends WhatElse> extends ArrayList<B>{

因为超类显然位于java.lang包中,所以你只给Superclass一个“自己的”泛型参数。
而java需要一个清晰的结构来编译类! 例如:您应该覆盖哪些方法?

答案 1 :(得分:0)

这一行的一些信息:public void function showdialog() { Toast.makeText(getBaseContext(), "Total Pending Notifications: " + pen_notifs, Toast.LENGTH_SHORT).show(); progressbar.setVisibility(View.VISIBLE); } 永远不会奏效! 您无法生成也不能使用Tb[] ret = new Tb[0];的Generic Arrays!