簡體   English   中英

Java泛型類型繼承錯誤

[英]Java generic types inheritance error

在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();
    }
}

問題是B是參數化類型,但b2被聲明為原始 B作為其類型。

你用b1演示了B的類型參數與A的不同,即使它們具有相同的名稱,因此B的類型參數與從A<String>繼承的getT()方法的返回類型無關。 但是,當您使用原始類型時,您將獲得該類型的完全擦除 ,包括其超類型。

由於A的類型參數是無界的,因此它的擦除產生類型Object ,因此這是b2.getT()的類型。 當然, Object不能賦予String

您可以通過以下兩種方式解決此問題:

  1. 不要將原始類型用於b2 如果您不關心其類型參數,請使用B<?> 要么,

  2. 刪除B類的類型參數。 它不適用於您的示例中的任何內容,因此這將是最干凈的事情。 僅僅因為它的超類是通用的並不意味着B必須是。

我認為沒有模板對象的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();
}

這里的問題是getT()返回對象。 你需要做的是實現一個方法toString() ,它以String形式給出T對象的值(或者只是將t3t4的類型更改為T因此聲明出現在T t3 = b1.getT();T t4 = b2.getT(); )。

此外,您應該執行以下操作,而不是使用B代碼。

B<T> b1;
B<T> b2;

請注意,您需要在調用b1.anyMethod()之前將B初始化為某些內容,否則您將獲得NullPointer Exception

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM