使用上限从原始类型的 java 对象隐式继承 kotlin 对象

Inherit kotlin object from raw-type java object implicitly using upper bound

提问人:Николай Костин 提问时间:8/4/2023 更新时间:8/7/2023 访问量:26

问:

我有:

class BaseActivity extends Activity { ... }

我想像这样改变它:

class BaseActivity<T extends BaseActivity<T>> { ... }

但我不想更改项目中的所有文件

在 Java 中,我可以:

class HomeActivity extends BaseActivity { ... }

是的,我会收到“原始使用参数化类'BaseActivity'”警告,但是 在 Kotlin 中,我必须显式编写一个类型:

class HomeActivity : BaseActivity<HomeActivity>() { ... }

或者错误将是“类 BaseActivity<T 应有一个类型参数:BaseActivity<*>!>”

有什么选择可以让它工作吗?

java kotlin 泛型 继承原始 类型

评论

2赞 Andy Turner 8/4/2023
创建一个类,并让所有你想成为泛型的类扩展它。GenericBaseActivity
0赞 Tenfour04 8/4/2023
有关 BaseActivities 的警告:stackoverflow.com/a/72994918/506796
1赞 Jorn 8/4/2023
不可以,Kotlin 不允许您使用原始类型。他们可以这样做,因为它从一开始就是一种语言功能。Java 之所以允许它,只是因为他们必须这样做,以实现向后兼容性。

答:

0赞 James Lan 8/7/2023 #1

这个技巧是允许超类使用子类的类型。

例如,您可以将字段/方法定义为BaseActivity<T>

  List<T> siblings;
  void addSibling(T sibling);

然后在扩展的子类中,将有来自超类的类型化成员,HomeActivityBaseActivity<HomeActivity>

  List<HomeActivity> siblings;
  void addSibling(HomeActivity sibling);

使用原始类型会导致这些成员的类型丢失。