[英]Java call non-generic method from generic method
我正在嘗試重構一些東西。 我有以下類層次結構:
class BaseItem {..}
class ItemA extends BaseItem {..}
class ItemB extends BaseItem {..}
class BaseContext<T extends BaseItem> {..}
class ContextA extends BaseContext<ItemA> {..}
class ContextB extends BaseContext<ItemB> {..}
以及消費者需要使用的 2 種方法:
public void methodA(ItemA) {..}
public void methodB(ItemB) {..}
是否有可能為這 2 種方法設置一個通用的 Consumer? 現在,我有 2 個非通用的:
Consumer<ContextA> consumerA = ctx -> methodA(ctx.getItem());
Consumer<ContextB> consumerB = ctx -> methodB(ctx.getItem());
我會說這是不可能的,因為類型擦除,我只是想確保
在我看來,您可以使用通用方法將您的Item
消費者轉換為Context
消費者。 它可能看起來像這樣。 目前尚不清楚這是否會滿足您的要求,因為我不確定您打算如何使用您的上下文使用者。
public <T extends BaseItem, U extends BaseContext<T>> Consumer<U> wrap(Consumer<T> innerConsumer) {
return context->innerConsumer.accept(context.getItem());
}
你就會有
Consumer<ContextA> consumerA = wrap(this::methodA);
Consumer<ContextB> consumerB = wrap(this::methodB);
這兩種方法期望Item
特定子類型而不是公共基類型,並且您希望將所有相同的變量聲明為通用基公共類。
這是沒有意義的。
你實際使用的方式:
Consumer<ContextA> consumerA = ctx -> methodA(ctx.getItem());
Consumer<ContextB> consumerB = ctx -> methodB(ctx.getItem());
符合您的實際 API :
public void methodA(ItemA) {..}
public void methodB(ItemB) {..}
如果你想聲明:
Consumer<Context> consumerA = ctx -> methodA(ctx.getItem());
Consumer<Context> consumerB = ctx -> methodB(ctx.getItem());
您需要一個 API,例如:
public void methodA(Item) {..}
public void methodB(Item) {..}
否則,作為替代方案,您當然可以沮喪。 但這實在是不可取。
如果你現在不能重構你的 API,你應該堅持實際的設計。 如果你真的需要讓你的代碼更“通用”並按接口編程,你應該開始一步一步地重構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.