java - Java 中的泛型方法模式

标签 java generics design-patterns

我是 Java 泛型的新手,花了很多时间寻找合适的解决方案(如果有的话)。

我正在尝试设计处理特定类型类对象的适配器。如下所述,CAdapter 类仅处理“CClass”对象。我试图提供一个抽象的通用适配器来处理大部分工作(很像 LinkedList 等 Java 集合)。然后,我为需要支持的每种类型提供具体的适配器实现。

// Classes

public interface AInterface {
  public String toString();
}

public class BClass extends AInterface  {
  public String toString() { return "BClass "; }
}

public class CClass extends AInterface  {
  public String toString() { return "CClass"; }
}

// Adapters

public interface AdapterInterface<T extends AInterface> {
  public T getInterface();
}

public class BAdapter implements AdapterInterface<BClass> {
  private BClass aInterface = null;
  public BClass getInterface() { return aInterface; }
}

public class CAdapter implements AdapterInterface<CClass> {
  private CClass aInterface = null;
  public CClass getInterface() { return aInterface; }
}

首先,我读到为这样一个通用适配器提供一个具体的实现是不受欢迎的(关于上帝杀死一只小猫的事情)!也许有人可以对此进行扩展?

其次,我遇到了一个动态实例化适配器的问题,并且没有让 Java 编译器提示。比如我有方法:

public <T extends AInterface> AdapterInterface<T> getAdapter(String type) {
  AdapterInterface<T> result = null;
  if (type.equals("C") {
    result = new CAdapter();
  }
  return result;
}

当然,编译器会提示CAdapter not matching。给定任何类型的 AInterface 对象,我希望能够加载正确的适配器并适本地处理它。我无法理解工厂模式来完成此任务。

如有任何想法,我们将不胜感激。

最佳答案

我的回答有点多余,但是:

任何带有 的东西都意味着“我的调用者知道这个类型是什么,但我不知道”。所以

AdapterInterface<T> result = null;

意思是“我实际上不知道结果是什么类型,它是我的调用者认为的任何类型”。编译器对此提示:

result = new CAdapter();

因为这段代码不能假定 T 是 CClass。

事实上,没有没有强制转换的方法可以做到这一点(声明该方法为通配符只意味着您需要在调用它的地方强制转换结果)。强制转换是您告诉编译器的方式“我知道您无法知道这是什么,没关系:我知道。相信我。冷静。”。是的,您会收到警告。没关系。

泛型不会消除所有类型转换,但它们允许您只执行一次。不需要在所有地方进行强制转换,您只需要在您(编码员)确定您正在玩类型游戏的那个地方使用它们。所有其余代码,使用您刚创建的适配器的代码,都可以安全地使用通用类型。

关于java - Java 中的泛型方法模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105603/

相关文章:

java - 将 SpringRunner 与 PowermockRunner 结合使用时出现异常

java - 获取用户在 hibernate 环境中所做的所有更改

java - 避免以下未经检查的警告

c# - 复杂泛型中的无效方差

c++ - 存储一个函数c++,稍后调用

design-patterns - 是否可以在 Haskell 中为排序二叉树创建 Functor 实例?

java - Log4J SMTP 附加程序问题

java - 监控队列 - ConcurrentLinkedQueue?

java - 两种创建具有相同结果的泛型数组的方法,但只有一种有效

python - 包含只有静态方法的类的模块