【发布时间】:2015-01-15 23:13:53
【问题描述】:
我来自 C++,我正在尝试继承 Java 中的通用参数类型。基本上,我正在尝试模拟以下 C++ 模式:
在 C++ 中,我可以做到:
#include <iostream>
class Node
{
Node* next;
};
class BaseVisitor
{
public:
BaseVisitor(Node* ptr)
{
std::cout<<ptr<<"\n\n";
delete ptr;
}
~BaseVisitor() {};
protected:
virtual Node* Generate() = 0;
};
class DynamicVisitor : public BaseVisitor
{
public:
DynamicVisitor(Node* ptr) : BaseVisitor(ptr) {}
protected:
virtual Node* Generate()
{
std::cout<<"Dynamic Visitor\n";
return new Node();
}
};
class StaticVisitor : public BaseVisitor
{
public:
StaticVisitor(Node* ptr) : BaseVisitor(ptr) {}
protected:
virtual Node* Generate()
{
std::cout<<"Static Visitor\n";
return NULL;
}
};
template<typename T>
class TestVisitor : public T //THIS is where the magic happens..
{
public:
TestVisitor() : T(this->Generate()) {} //allows me to call "Generate".
};
int main()
{
TestVisitor<DynamicVisitor> foo = TestVisitor<DynamicVisitor>();
TestVisitor<StaticVisitor> bar = TestVisitor<StaticVisitor>();
}
输出:
Dynamic Visitor
0x605ed0
Static Visitor
NULL
如何在 Java 中做同样的事情?我试过了:
public class Node {
Node next;
}
public abstract class BaseVisitor {
public BaseVisitor(Node n) {System.out.println(n);}
protected abstract Node generate();
}
public class DynamicVisitor extends BaseVisitor {
public DynamicVisitor(Node n) {
super(n);
}
@Override
protected Node generate() {
return new Node();
}
}
public class StaticVisitor extends BaseVisitor {
public StaticVisitor(Node n) {
super(n);
}
@Override
protected Node generate() {
return null;
}
}
public class TestVisitor<T extends BaseVisitor> extends T { //error.. Cannot extend "T".. No magic happens..
public TestVisitor() {
super(this.generate()); //cannot call generate()..
}
}
这种模式叫什么?我称它为“基础工厂”模式,但我不确定它的真实名称,所以我不确定要搜索什么..
如何在 Java 中执行与 C++ 中相同的操作?有没有“任何方式”在 Java 中做同样的模式?
【问题讨论】:
-
这就是 C++ zings 而 java zangs 的地方。在 C++ 中,模板基本上是花哨的预处理器宏,会导致生成不同的运行时对象。在 java 中,在运行时只有一个模板化类的版本(其类型参数被删除)。这禁止您执行上述操作。但是,您可以使用匿名类或 java 8 lambda 提出解决方案。
标签: java c++ templates generics