java 泛型类型转换_Java泛型-类型转换问题

您的A和B类似乎都提供set / getCreatedTime和set / getUpdatedTime方法.

如果其他28个左右的类也提供了这些类(如您的问题所暗示),则只需为所有类实现具有这些方法的通用接口即可.

然后,您可以将方法的通用类型绑定到该接口,并放弃所有instanceof语句和后续的显式转换.

唯一的缺点是,如果列表中的字段名与传递给该方法的具体类无关.

如果要强制执行此操作,则可以在对象上使用反射来发现该字段是否按名称存在.然后,您可以使用已记录的警告(或您认为合适的任何机制)轻松处理任何缺少的字段.

注意

如thijs-steel所述,如果您的“时间”方法共享相同的实现,则您可以让您的30个类扩展一个仅实现“时间”方法的通用抽象父级.

或者,由于您显然使用的是Java 8,因此可以使用默认方法.

interface I {

// assuming parameters and return types here

public void setCreatedTime(ZonedDateTime z);

public void setUpdatedTime(ZonedDateTime z);

public ZonedDateTime getCreatedTime();

public ZonedDateTime getUpdatedTime();

}

// A, B etc. all implement I

public void find(T object, List fieldsToBeUpdated) {

fieldsToBeUpdated

.parallelStream()

.forEach(

field -> {

switch(field) {

case "a": {

try {

object.getClass().getDeclaredField("a");

// we're good

object.setCreatedTime(...);

}

catch (NoSuchFieldException e) {

// TODO something

}

break;

}

// ...

}

});

}

更新资料

如果您的课程根本不共享任何公共字段,那么您可能希望完全更改整个方法.

您可能希望使用继承并在每个单个类中拥有自己的find方法实现,而不是拥有“一个通用方法适合所有人”的逻辑实现范例.

这将允许在每个实现中使用更小的switch语句,并在默认情况下执行错误处理.

您仍然可以通过使find方法采用T扩展Findable来概括行为(其中Findable声明“时间”方法,现在声明find方法),并简单地在给定的T对象上调用find.

甚至在Findable和Timed之间分开关注,并让您的类同时实现.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值