作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做一些我通常不会做的事情,这有点奇怪,但我想让它发挥作用。本质上,我有一个工厂,它必须通过调用具有不同类型数据的构造函数来创建对象(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/
我是一名优秀的程序员,十分优秀!