gpt4 book ai didi

java - 泛型调用构造函数

转载 作者:行者123 更新时间:2023-12-02 00:54:05 29 4
gpt4 key购买 nike

我正在尝试做一些我通常不会做的事情,这有点奇怪,但我想让它发挥作用。本质上,我有一个工厂,它必须通过调用具有不同类型数据的构造函数来创建对象(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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com