Я иду из C++, и я пытаюсь наследовать тип параметра Generic в Java. В принципе, я пытаюсь подражать ниже C++ шаблон:Java extend Generic Type Parameter
В 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()..
}
}
Что эта модель называется? Я называю это шаблоном «Base Factory», но я не уверен, что это настоящее имя, поэтому я не был уверен, что искать.
Как я могу сделать то же самое, что и на C++, на Java? Есть ли какой-либо способ сделать один и тот же шаблон в Java?
Это где C++ zings в то время как java zangs. В C++ шаблоны - это в основном причудливые макросы препроцессора, которые приводят к созданию разных создаваемых объектов времени исполнения. В java существует только одна версия шаблонизированного класса во время выполнения (с стираемым типом параметра). Это запрещает вам делать такие вещи, как выше. Однако вы можете придумать решения, используя анонимные классы или java 8 lambdas. –