Вы должны попытаться изменить свой SQL на более новую нотацию JOIN , поскольку это значительно упростит подобные вещи, тогда вы можете использовать LEFT JOIN , чтобы указать необязательный стол ...
SELECT a.cusName, a.cusMob, a.invoiceNo,
a.invoiceDate, a.total_VAT, a.bill_tot,
b.itemsName ,b.rate, b.amt_vat,
ROUND(b.amt_vat + b.amount, 2) as amount
FROM invoices a
LEFT JOIN invoice_items b ON a.invoiceID=b.invoiceid
WHERE a.invoiceDate between '$getfromdate' and '$gettodate'
and a.status IS NULL
order by a.invoiceID desc
Я бы также рекомендовал вам посмотреть на использование подготовленных высказываний , поскольку они имеют много преимуществ.
Это не просто проблема о дженериках.
Если Вы говорите:
SuperClass obj = new SubClass();
System.out.println(obj.getName());
Вы также станете "супер". Нет никаких "полиморфных" статических методов.
В Вашем случае весь компилятор знает о T
это, это расширяется SuperClass
, таким образом, это будет звонить SuperClass.getName()
.
В отличие от шаблонов C++, дженерики Java работают стиранием типа, таким образом, оно только генерирует один класс для всех значений T
, и переводит все ссылки на тип T
в этом классе к супер типу T
, в этом случае SuperClass
, затем использует виртуальную отправку для обеспечения различия для вызовов к методам объекта и статической отправки к вызовам к статическим методам.
Таким образом, когда Вы делаете Dummy<SubClass>.print()
, компилятор не делает глобальную замену T
с SubClass
в Dummy
. Весь компилятор делает проверить это использование T
поскольку аргумент или возврат вводят в методах Dummy
SubClass
. Нет никакого изменения ни в каком коде внутри Dummy
, так то же SuperClass
статический метод называют что T
.
Если Вы хотите другое поведение в универсальном классе в зависимости от параметризованного типа, Вы имеете, передают объект этого, вводят и используют виртуальный метод или передачу в классе для типа и используют отражение.
Когда Вы instanciated, который класс с "новым Макетом ()" Вы назвали конструктором по умолчанию, который ничего на самом деле не устанавливает. Когда метод печати назвали, VM видел, что типом T, как объявлено в объявлении класса, является SuperClass; Это затем называет статический метод для этого класса.