在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();
}
}
答案 0 :(得分:1)
问题是B
是参数化类型,但b2
被声明为 raw B
作为其类型。
您使用b1
证明B
的类型参数与A
不同,即使它们具有相同的名称,因此B&# 39; s类型参数与从getT()
继承的A<String>
方法的返回类型无关。但是,当您使用原始类型时,您将获得该类型的完整擦除,包括其超类型。
由于&#39; A
的类型参数是无界的,因此其删除会生成类型Object
,因此这是b2.getT()
的类型。当然,Object
无法分配String
。
您可以通过以下两种方式解决此问题:
不要使用b2
的原始类型。如果您不关心其类型参数,请使用B<?>
。或者,
删除类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
所以宣言出现在T
和T t3 = b1.getT();
)。
此外,您应该执行以下操作,而不是使用B代码。
T t4 = b2.getT();
请注意,您需要先将B初始化为某个内容,然后才能拨打B<T> b1;
B<T> b2;
,否则您将获得b1.anyMethod()
。