Если вы пытаетесь что-то вроде
if (tokens[1].equals("DOUBLE"))
BTree<Double> t = new BTree<Double>();
else if (tokens[1].equals("CHARACTER"))
BTree<Character> t = new BTree<Character>();
// etc.
t.doStuff();
Это не сработает. Во-первых, потому что переменные t
находятся только в области действия их операторов if
, а во-вторых, потому что вы не можете сделать так, чтобы переменные имели разные статические типы по разным путям кода.
Вы могли бы сделать что-то вроде
BTree<?> t;
if (tokens[1].equals("DOUBLE"))
t = new BTree<Double>();
else if (tokens[1].equals("CHARACTER"))
t = new BTree<Character>();
// etc.
Но тогда вы не сможете сделать ничего полезного с элементами, хранящимися в t
, потому что следующий код не знает, что это за дерево. Это скорее фундаментальная проблема проектирования, а не проблема синтаксиса.
Вы можете создать интерфейс - давайте назовем его ValueHolder
- и использовать его для определения любых операций, которые вам нужно выполнить над значениями в дереве. Затем определите классы, такие как DoubleHolder
, CharacterHolder
и т. Д., Которые реализуют интерфейс ValueHolder
. Тогда вы можете написать:
BTree<? extends ValueHolder> t;
if (tokens[1].equals("DOUBLE"))
t = new BTree<DoubleHolder>();
else if (tokens[1].equals("CHARACTER"))
t = new BTree<CharacterHolder>();
// etc.
и после этого вы можете извлекать элементы из дерева, и они будут иметь тип ValueHolder
, поэтому вы можете вызывать любой из методов, предоставляемых этим интерфейсом.