java - 泛型调用构造函数

标签 java

我正在尝试做一些我通常不会做的事情,这有点奇怪,但我想让它发挥作用。本质上,我有一个工厂,它必须通过调用具有不同类型数据的构造函数来创建对象(A 和 B 在下面的代码中采用不同的类型)。我似乎已经陷入了泛型路线的困境(我确实需要代码尽可能在编译时类型安全)。我不反对以不同的方式编写代码(如果可能的话,我想保留工厂的想法,并且我不想添加强制转换 - 因此“数据”参数不能是“对象”)。

关于如何使用泛型修复代码或满足我的要求的替代方法有什么想法吗?

(从技术上讲,这是家庭作业,但我是尝试新东西的老师......所以这不是真正的家庭作业:-)

public class Main2
{
    public static void main(String[] args) 
    {
        X<?> x;

        x = XFactory.makeX(0, "Hello");
        x.foo();

        x = XFactory.makeX(1, Integer.valueOf(42));
        x.foo();
    }

}

class XFactory
{
    public static <T> X<T> makeX(final int i,
                                 final T   data)
    {
        final X<T> x;

        if(i == 0)
        {
            // compiler error: cannot find symbol constructor A(T)
            x = new A(data);
        }
        else
        {
            // compiler error: cannot find symbol constructor B(T)
            x = new B(data);
        }

        return (x);
    }
}

interface X<T>
{
    void foo();
}

class A
    implements X<String>
{
    A(final String s)
    {
    }

    public void foo()
    {
        System.out.println("A.foo");
    }
}

class B
    implements X<Integer>
{
    B(final Integer i)
    {
    }

    public void foo()
    {
        System.out.println("B.foo");
    }
}

最佳答案

我没有找到让它发挥作用的方法。我真的认为它也不应该起作用。当调用您的makeX()时函数调用代码需要知道哪个整数参数对应于要传入的数据类型。IOW,您的抽象首先非常有漏洞,您真正实现的是多态性的基本形式,您可能会这样做我们将使用方法重载,即:

X makeX(String data) {
  return new A(data);
}

X makeX(Integer data) {
  return new B(data);
}

当然,这是一个玩具问题等等。使其工作的一种方法是让客户端了解实现类并添加 Class<T>您通过反射实例化的参数。但我认为这有点违背了目的。

关于java - 泛型调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1685291/

相关文章:

java - 如何将使用 eclipse 和 tomcat 构建的 Java EE 项目部署到万维网?

java - ils。从远程服务器调用CURL后重定向不起作用

java - 使用Struts Action设计问题

java - OpenCv安卓: Copy part of an image to new Mat

java - JCS还是java.util.Map,哪个在时间上效率更高?

java - GUI actionPerformed valueChanged 问题

java - 处于等待状态的线程 - Apache Tomcat

java - 如何在java或任何其他工具中将具有不同节点结构的多个xml文件合并到单个xml文件中?

java - Firebase Cloud Firestore - 将文档获取到自定义对象并将其传递给另一个 Activity

java - 无法将 Theme.Holo 用于我的第一个 Android 应用程序的样式