PECS (производитель extends
и потребитель super
)
Мнемоника → принцип Get и Put.
Этот принцип гласит, что:
В Java параметры и параметры типового типа не поддерживают наследование следующим образом.
class Super {
void testCoVariance(Object parameter){} // method Consumes the Object
Object testContraVariance(){ return null;} //method Produces the Object
}
class Sub extends Super {
@Override
void testCoVariance(String parameter){} //doesn't support eventhough String is subtype of Object
@Override
String testContraVariance(){ return null;} //compiles successfully i.e. return type is don't care
}
Принцип подстановки Лискова: Массивы являются ковариантными (небезопасными), но Generics не являются, то есть инвариантными (безопасными). Принцип подстановки не работает с параметризованными типами, что означает, что это незаконно писать. Ковариант просто означает, что X
является подтипом Y
, тогда X[]
также будет подтипом Y[]
.
Object name= new String("prem"); //works
List numbers = new ArrayList();//gets compile time error
Integer[] myInts = {1,2,3,4};
Number[] myNumber = myInts;
myNumber[0] = 3.14; //attempt of heap pollution i.e. at runtime gets java.lang.ArrayStoreException: java.lang.Double(we can fool compiler but not run-time)
List list=new ArrayList<>();
list.add("prem");
List
ограниченный (т. е. заголовок к чему-либо) подстановочный знак: Есть 3 разных варианта подстановочных знаков:
?
или ? extends Object
- неограниченный подстановочный знак. Он обозначает семью всех типов. Использовать, когда вы оба получаете и ставите. ? extends T
(семейство всех типов, которые являются подтипами T
) - подстановочный знак с верхней границей. T
является самым верхним классом в иерархии наследования. Используйте подстановочный знак extends
, когда вы получаете только значения из структуры. ? super T
(семейство всех типов, которые являются супертипами T
) - подстановочный знак с нижней границей. T
является самым низким классом в иерархии наследования. Используйте подстановочный символ super
, если вы только поместите значения в структуру. Примечание: подстановочный знак ?
означает ноль или один раз, представляет неизвестный тип. Подстановочный знак может использоваться как тип параметра, никогда не используемый в качестве аргумента типа для вызова общего метода, создания экземпляра универсального класса (т. Е. При использовании подстановочного знака, эта ссылка не используется в другом месте программы, как мы используем T
).
class Shape { void draw() {}}
class Circle extends Shape {void draw() {}}
class Square extends Shape {void draw() {}}
class Rectangle extends Shape {void draw() {}}
public class TestContraVariance {
/*
* Example for an upper bound wildcard (Get values i.e Producer `extends`)
*
* */
public void testCoVariance(List extends Shape> list) {
list.add(new Shape()); // Error: is not applicable for the arguments (Shape) i.e. inheritance is not supporting
list.add(new Circle()); // Error: is not applicable for the arguments (Circle) i.e. inheritance is not supporting
list.add(new Square()); // Error: is not applicable for the arguments (Square) i.e. inheritance is not supporting
list.add(new Rectangle()); // Error: is not applicable for the arguments (Rectangle) i.e. inheritance is not supporting
Shape shape= list.get(0);//compiles so list act as produces only
/*You can't add a Shape,Circle,Square,Rectangle to a List extends Shape>
* You can get an object and know that it will be an Shape
*/
}
/*
* Example for a lower bound wildcard (Put values i.e Consumer`super`)
* */
public void testContraVariance(List super Shape> list) {
list.add(new Shape());//compiles i.e. inheritance is supporting
list.add(new Circle());//compiles i.e. inheritance is supporting
list.add(new Square());//compiles i.e. inheritance is supporting
list.add(new Rectangle());//compiles i.e. inheritance is supporting
Shape shape= list.get(0); // Error: Type mismatch, so list acts only as consumer
Object object= list.get(0); // gets an object, but we don't know what kind of Object it is.
/*You can add a Shape,Circle,Square,Rectangle to a List extends Shape>
* You can't get an Shape(but can get Object) and don't know what kind of Shape it is.
*/
}
}
Да, это грязно, я не могу думать о способе избежать его все же.
Вы могли скрыть часть беспорядка от клиента путем помещения создания временной таблицы в хранимую процедуру (и использование "выполняются непосредственный" для, чтобы создания они представляют в виде таблицы)
Одна вещь, которую необходимо будет не упустить, оставлен по временным таблицам (должен что-то приводить половину к сбою пути через сессию, прежде чем у Вас было время для чистки его) - Вы могли запланировать задание оракула для периодического выполнения и удалить любые перенесенные таблицы.
Вы могли использовать представления materalized для обработки всего управления "кэшем". ItВґs, не прекрасный, но работы в большинстве случаев :)
Вы имеете определенный сценарий в виду? Например, если LOB содержит файлы, и Вы находитесь на интранет компании, возможно, можно записать хранимую процедуру, чтобы извлечь файлы к известному каталогу в сети и получить доступ к ним оттуда.
В этом конкретном случае может единственный способ, которым могут связаться эти две системы, использует dblink.
кроме того, решение для таблицы не настолько ужасно, это просто грязно для "кэширования" данных по моей стороне dblink.