簡體   English   中英

Java從泛型方法調用非泛型方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM