[java] ну это ваще пипец...
а зачем?
главное, это ведь просто должно реализовываться и логично этой хрени существовать.
Своими словами скажи, что ты хотел добиться такой записью? а то я плаваю в Java-синтаксисе.
имхо, ты java не в ту сторону копаешь. Контейнеры в java.utils вполне заменяют дженерики
Метод, у которого аргумент -- класс параметризованный классом, который в иерархическом дереве находится на заданном отрезке [A,B] (или [B,A] -- как кому угодно). Вроде так.
не понял мысль...
Вот это совсем не понял.
В нынешнем синтаксисе можно только задавать отрезки [Object,A] и [A,\infty].
Ну, является потомком A и предком B.
> на заданном отрезке [A,B]
Вот это совсем не понял.
Дело в том, что у массивов-на-чтение действует ковариантный закон, то есть если A1<A2, то и A1[] < A2[]. А вот для массивов-на-запись закон контрвариантный!
Я недавно в Си на похожую тему прикол однаружил. (A *) можно неявно скастить в (const A * и к этому уже все привыкли, так вот оказывается неявно скастить (A * *) в (const A * *) нельзя! Все подумайте на досуге почему
С трудом понимаю смысл этого ограничения.
Зачем такое надо?
Популярно могу объяснить вот как:
class Templ<T> {
T a;
T f {...}
void f(T b) {...}
}
static void f(Templ<? extends B> t) {
B b;
b= t.f; // ok
// t.f(b); // bad
}
static void g(Templ<? super C> t) {
C c= new C;
// c= t.f; // bad
t.f(c); // ok
}
Это понятно.
Не совсем было понятно - когда появляется ограничение, что тип должен быть предком данного типа..
Но сейчас дошло, что при чтении - если реальный тип B, то отдавать мы его можем только, как один из его базовых типов.
"С++ Gotchas",
Зачем такое надо?
Вот там где "exception!" там в Java-е реально происходит exception, потому что любое присваивание в массив подразумавает динамическую проверку типизации, можно присвоить или нет. Для языка со статической типизацией это nonsence, но разработчики на это пошли, очень уж многие искренне верят, что если у f параметр имеет тип A[], то можно подать в качестве аргумента A1[].
class A1 extends A {...}
A1[] x = new A1[10];
f(x);
void f(A[] x) {
x[0] = new A; //exception!
}
Так вот чтобы этого overhead-а избежать можно ввести вместо понятия "массив из A
(и потомков?)" понятие "контейнер из элементов от A до B", и один контейнер будет кастится в другой есть соответствующие отрезки друг в друга вложены. А в динамике проверки типизации не будет ни при записи ни при чтении...
очень уж многие искренне верят, что если у f параметр имеет тип A[], то можно подать в качестве аргумента A1[]
Кстати, а что в этом реально плохого? Я, кажется, где-то наталкивался на обсуждение, но там было слишком много английских слов и я устал читать.
В Джава по-любому проверка будет, с дженериками ее вставляет компилятор.
очень уж многие искренне верят, что если у f параметр имеет тип A[], то можно подать в качестве аргумента A1[]Кстати, а что в этом реально плохого?
В Java-е выбрана первая глупость...
class A1 extends A {
public int m { return 1; }
}
void f(A[] x) {
x[0] = new A; //либо здесь глупость: нельзя в A[] положить new A?
}
A1[] x = new A1[10];
f(x);
x[0]->m; //либо здесь: нет такого метода в классе A!
Первая глупость более логичная
Оставить комментарий
psihodog
Ну почему нельзя писать:?