Java泛型类型继承错误

时间:2017-01-12 16:29:01

标签: java generics inheritance

在Android Studio中,我遇到以下错误:

  

java:不兼容的类型:java.lang.Object无法转换为   java.lang.String中

我认为b1和b2应该表现相同,但它们不是。

有没有办法让它们表现一样(不改变它们的课程类型)?

以下是输入的代码:

public class Test
{
    class A<T>
    {
        T t;
        T getT()
        {
            return t;
        }
    }
    class AS extends A<String>
    {

    }
    class B<T> extends AS
    {

    }

    B<Object> b1;
    B b2;

    public void test()
    {
        String t3 = b1.getT();
        String t4 = b2.getT();
    }
}

3 个答案:

答案 0 :(得分:1)

问题是B是参数化类型,但b2被声明为 raw B作为其类型。

您使用b1证明B的类型参数与A不同,即使它们具有相同的名称,因此B&# 39; s类型参数与从getT()继承的A<String>方法的返回类型无关。但是,当您使用原始类型时,您将获得该类型的完整擦除,包括其超类型。

由于&#39; A的类型参数是无界的,因此其删除会生成类型Object,因此这是b2.getT()的类型。当然,Object无法分配String

您可以通过以下两种方式解决此问题:

  1. 不要使用b2的原始类型。如果您不关心其类型参数,请使用B<?>。或者,

  2. 删除类B的类型参数。它没有用于你的例子中的任何东西,所以这将是最干净的事情。仅仅因为它的超类是通用的并不意味着B必须是。

答案 1 :(得分:0)

我认为没有模板对象的B是一个不完整的类,而不是B<Object>。这就是为什么当你调用getT()时,你实际上是在调用A.getT()

这就是为什么在下面的代码中,只有String t3 = b2.getT();无法编译。

static class A<T>
{
    T t;
    T getT()
    {
        return t;
    }
}

static class AS extends A<String> {}

static class B<T> extends AS {}

static class C extends B<Object> {}

static A a;
static B<Object> b1 = null;
static B b2 = new B();
static C c = new C();

static void test()
{
    Object tt = a.getT();
    String t2 = b1.getT();
    String t3 = b2.getT();
    String t4 = c.getT();
}

答案 2 :(得分:-1)

这里的问题是getT()返回对象。您需要做的是实现一个方法toString(),该方法以T的形式给出String对象的值(或者只更改t3和{{的类型1}}到t4所以宣言出现在TT t3 = b1.getT();)。

此外,您应该执行以下操作,而不是使用B代码。

T t4 = b2.getT();

请注意,您需要先将B初始化为某个内容,然后才能拨打B<T> b1; B<T> b2; ,否则您将获得b1.anyMethod()