[英]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
。
您可以通過以下兩種方式解決此問題:
不要將原始類型用於b2
。 如果您不關心其類型參數,請使用B<?>
。 要么,
刪除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
對象的值(或者只是將t3
和t4
的類型更改為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.