>>К .Net можно поставить GTK# и писать нормальные приложения.
>Ты много написал? Покажи хоть одно пожалуйста.
Достаточно, чтобы быть уверенным, что оно работает. Не идеально, но стабильно и без особых глюков.
Дорастут приложеньица до состояния "интересно не только мне" - покажу.
>возьми 10 приложений на C# и 9 (если не 10) из них будут работать только на windows.
без пересборки под той же моно? не ставил такой задачи. Хорошо, когда работает, как есть, но совершенно не обязательно.
>Вопрос, а зачем тогда на linux нужен mono когда есть wine?
стабильно работающие приложения с нормальной интеграцией. приложения под wine глючат, имеют проблемы с русским в клипборде и т.д. и потому рабочими не являются.
Интересно почему hugin, autopano написаны на C# и используют Mono? В Fedora 5 наверное еще другие приложения найдутся, наверное. Я не защищаю C#, мне не понятно зачем он нужен, но просто интересно?
> Вопрос, а зачем тогда на linux нужен mono когда есть wine?
На самом деле моно не столько для тех кто хочет запускать виндовс на линуксе, сколько наоборот. В этом смысле даже моно позиционируется как альтернативный .NET, а не просто .net unix port, именно поэтому у них есть и виндовая версия. То есть это скорее для тех кто хочет свои приложения под линукс заставить работать под виндой тоже. В этом смысле моно конкурирует с java.
>Видимо очень большой кровью им этот JVM достался.
Не "им" а индустрии. Если микрософт поддерживает только себя любимую и они в одиночном порядке могут поменять .NET, то на рынке java дохренища вендоров. При изменении VM надо будет не просто санкам написать и под три платформы скомпилять, а есть еще упоминавшиеся тут openVMS, Tru64 который тут упоминался, есть apple, есть SGI со своей поддержкой всех своих процессоров и терабайт на irix, IBM со всеми своими железками....
>Потому-что если ты изменишь JVM, то код, написанный для JDK 1.3 не будет работать в JDK 1.5. И потому-что нечего всякой ненужной чешуей язык замусоривать. Зачем мне что-то внесенное в язык, если я могу сделать то же самое при помощи внешней библиотеки?
C# например обеспечивает совместимость сверху в низ - неужели это такая неразрешимая проблема для жаба?
>На мой вопрос "А чем же плохи дженерики" меня грубо обозвали. Я не работал в Java с Generics, и просто спрашивал. Вопросы в этом форуме уже не приветствуются? Кстати, Анонимус, объясни пожалуйста, чем все же плохи дженерики, и где они используются?
Обзываться - это здесь так принято, ибо здешний контингент - студенты, школьники, которые таким образом самоутверждающиеся и стеберы, стебающиеся на первыми двумя в свободную минуту. И соб-но на вопрос: дженерики ничем не плохи - плоха их реализация в жаба можно например просветиться здесь http://www-128.ibm.com/developerworks/java/library/j-jtp01255.html, ну а где используются дженерики и для чего - это нужно вам бы почитать что нибудь из литературы.
>Вот, нашел. А зачем так делать? Такие вещи должен делать паттерн Factory. Зачем вносить что-то подобное в язык? А если E - это интерфейс? Как ты new для интерфейса вызывать будешь? Что будет в C# если ты попытаешься сделать такое для класса, у которого нет пустого конструктора?
Вам бы почитать чего по дженерикам то. А то ведь за такие вопросы не ровен час опять обзовут.
>>>К .Net можно поставить GTK# и писать нормальные приложения.
>>Ты много написал? Покажи хоть одно пожалуйста.
>Достаточно, чтобы быть уверенным, что оно работает. Не идеально, но стабильно и без особых глюков. Дорастут приложеньица до состояния "интересно не только мне" - покажу.
Понятно, без особых глюков -хорошо звучит.
>>возьми 10 приложений на C# и 9 (если не 10) из них будут работать только на windows.
>без пересборки под той же моно? не ставил такой задачи. Хорошо, когда работает, как есть, но совершенно не обязательно.
когда у тебя нет исходных кодов - это обязательно.
>>Вопрос, а зачем тогда на linux нужен mono когда есть wine?
>стабильно работающие приложения с нормальной интеграцией. приложения под wine глючат, имеют проблемы с русским в клипборде и т.д. и потому рабочими не являются.
А mono стабильно работает? Запусти хоть одно приличное windows приложение на .net на mono. Оно просто не заработает, до глюков в clipboard не дойдет.
====================
Вот, нашел. А зачем так делать? Такие вещи должен делать паттерн Factory. Зачем вносить что-то подобное в язык? А если E - это интерфейс? Как ты new для интерфейса вызывать будешь? Что будет в C# если ты попытаешься сделать такое для класса, у которого нет пустого конструктора?
Вам бы почитать чего по дженерикам то. А то ведь за такие вопросы не ровен час опять обзовут.
====================
По этой ссылке не ходи. Аффтару опуса надо присоединятся к томми. Он нихрена не изучил java даже без генериков. А многие вещи о которых он написал вообще подсказывают о том что он нихрена не понимает зачем генерики вообще нужны.
==============
По этой ссылке не ходи. Аффтару опуса надо присоединятся к томми. Он нихрена не изучил java даже без генериков. А многие вещи о которых он написал вообще подсказывают о том что он нихрена не понимает зачем генерики вообще нужны.
==============
Таки сходил. Я это когда-то читал. О примерах: действительно оисаны вещи, малоприменимые в обычной практике программирования (по крайней мере я за 4 года Java-программинга с подобными ситуациями не сталкивался).
Типа "Вы не сможете при помощи микроскопа выковать ребра радиатора для Антаресианского звездолета"?
>Интересно почему hugin, autopano написаны на C# и используют Mono? В Fedora 5 наверное еще другие приложения найдутся, наверное. Я не защищаю C#, мне не понятно зачем он нужен, но просто интересно?
hugin написан на C++ и использует wxWidgets. autopano - IMHO сишный. На C# написан autopano-sift, который с Gtk# интерфейсом. Зачем - точно неизвестно...
>> Вопрос, а зачем тогда на linux нужен mono когда есть wine?
>На самом деле моно не столько для тех кто хочет запускать виндовс на линуксе, сколько наоборот. В этом смысле даже моно позиционируется как альтернативный .NET, а не просто .net unix port, именно поэтому у них есть и виндовая версия. То есть это скорее для тех кто хочет свои приложения под линукс заставить работать под виндой тоже. В этом смысле моно конкурирует с java.
Тогда уж конкурент не java, а kafe/gcj/classpath/etc ;-)
>О примерах: действительно оисаны вещи, малоприменимые
Дело не в малоприменимости. Например тип даже не знает что в Cloneable нету метода clone(), но рассчитывает что
<C extends Cloneable> C xClone(C c) {
return (C)c.clone();
}
должно откомпилироваться. И жалуется на генерики когда оно выдает ошибку копиляции. Он что - перепил? При чем тут генерики?
Второй перл:
class Foo {
public void doSomething(Set<?> set) {
Set<?> copy = new HashSet<?>(set); // illegal
}
}
Офигеть. Он что решил что "?" объявленный в параметре это тот же самый что и внутри метода? Какой нахрен "defensive copy" если он сам сказал что ему плевать какой там тип?
Если этот тип действительно " serves on several JCP Expert Groups " мне жалко Гослинга.
>Например тип даже не знает что в Cloneable нету метода clone(), но рассчитывает что
Где он пишет о clone в Cloneable? "Unfortunately, you still can't call param.clone(). Why? Because clone() has protected access in Object" -Вот что он пишет. Перевести?
>Офигеть. Он что решил что "?" объявленный в параметре это тот же самый что и внутри метода? Какой нахрен "defensive copy" если он сам сказал что ему плевать какой там тип?
Это статья для людей, которые хоть немного умеют думать. И речь идет о том, что если бы в рантайме имелась информация о параметризованных типах (добавлять надо фичи в jvm!), то и ситуация с clone и new HashSet<?>(set) элементарно бы разруливалась, ибо было бы известно что за тип скрывается под ? при каждом конкретном вызове doSomething и перегружен ли в Т или в его предках clone как паблик.
>Если этот тип действительно " serves on several JCP Expert Groups " мне жалко Гослинга.
Чтоже вы непредложите свою кандидатуру на его место? Или гослинг стал настолько туп?
Нет, читать перед этим. What about clone()? Let's say Foo was defined to make T extend Cloneable:
А почему не Runnable? Или Serializable? Или МожемПоискатьБолееДругойИнтерфейсКоторыйВсеРавноНеДекларитclone()able?
>Это статья для людей, которые хоть немного умеют думать.
Люди которые умеют думать понимают, что если в классе метод protected то из outer scope относительно домена и пакета его не видно, и генерики тут совершенно не при чем.
> new HashSet<?>(set) элементарно бы разруливалась
Ситуация с HashSet<?> элементарно разруливается как
<T> doSomethong(Set<T> s) {
Set<T> copy = new HashSet<T>(s);
}
Что такое new HashSet<?>() и как из этого должно родится defensive copy of a parameter это к гадалке.
Если кто не понимает, зачем нужны generic'и, то generic programming -- это "обобщенное программирование". Специальная версия алгоритма генерируется по обобщенной (написанной программистом), обеспечивая тем самым статический полиморфизм. И столь нелюбимый многими C++ -- это на сегодня в первую очередь templates (generic) и Standard Template Library. Templates в C++ по сути дела "язык в языке" (причем язык функциональный).
Да потому, что в этом случае компилятор был бы ОБЯЗАН непропустить такой код, т.к. он очевидно привел бы к CloneNotSupportedException в рантайме. С протектед методами ситуация действительно забавна и решать ее в рантайме было бы слишком накладно. Однако в С# такой проблемы нет. Нет ее и в С++ и в Ada и в Eiffel.
>Ситуация с HashSet<?> элементарно разруливается как <T> doSomethong(Set<T> s) { Set<T> copy = new HashSet<T>(s); }
Напишите код, и попробуйте скомпилить. Вы убедитесь что НЕ разруливается. Увы. Да и в вашем примере, когда "T" не имеет никакого семантического значения оно эквивалентно "?". По крайней мере это логично если смотреть с позиции здравого смысла.
>>Ситуация с HashSet<?> элементарно разруливается как <T> doSomethong(Set<T> s) { Set<T> copy = new HashSet<T>(s); }
>Напишите код, и попробуйте скомпилить. Вы убедитесь что НЕ разруливается. Увы. Да и в вашем примере, когда "T" не имеет никакого семантического значения оно эквивалентно "?". По крайней мере это логично если смотреть с позиции здравого смысла.
>Да потому, что в этом случае компилятор был бы ОБЯЗАН непропустить такой код
Хватит гнать на компилятор. Cloneable не декларирует никаких методов. Весь этот интерфейс шаманство для VMа и язык тут не при чем.
Для справки:
Cloneable c = new ArrayList();
c.clone();
Information: Compilation completed with 1 errors and 0 warnings
Information: 1 error
Information: 0 warnings
Error: line (13) cannot find symbol method clone()
Since начала времен. Без всяких генериков.
>Напишите код, и попробуйте скомпилить.
Для справки - компилиться и работает.
>Да и в вашем примере, когда "T" не имеет никакого семантического значения оно эквивалентно "?"
Для справки в моем пример T накладывает типовоге ограничения на параметр метода, локальную переменную и инстанс такое что все это должно быть _одного и того же типа - T_.
В примере с wildcard написано что параметр принимает любой мусор. Локальная переменная содержит любой мусор. Между "любой" и "один и тот же" разницу чувствуем? Вот и компилятор чувствует. Мой type variable связывает все декларации воедино, а wildcard "?" не делает этого.
Логично.
В RH всё-таки сидят нормальные бизнесмены, способные осознавать причинно-следственные связи.
Дело в том, что единственная качественная IDE для .NET и ASP .NET - это Visual Studio. Бесплатный к тому же, как бы не скрежетали зубами конкуренты.
А "шляпникам" надо, чтоб разработчики сидели и отлаживались под Windows?
Им нужен результат, когда отлаженный .NET или ASP .NET проект вдруг не заработает под RH EE с Mono и/или mod_aspnet?
>когда у тебя нет исходных кодов - это обязательно.
вот и пользуй тогда эмуляторы. mono - не эмулятор. Если под ним идут приложения от .Net, это совпадение, а не правило.
>А mono стабильно работает? Запусти хоть одно приличное windows приложение на .net на mono. Оно просто не заработает, до глюков в clipboard не дойдет.
на mono пишут приложения, а не используют вместо вайна. Под эмулятором приложение должно идти без перекомпиляции, как есть, но медленно и глючно. Под mono приложение должно идти также, как любое другое, родное.
>исходник на Java _компилируется_ в байт-код виртуальной машины, который к Java имеет довольно отстраненное отношение.
Это внутренние тонкости процесса. В питоне код точно также компилируется в бинарные *.pyc или *.pyo, имеющие малое отношение к языку и что? питон теперь - компилируемый язык?
В C# код вообще оформляется в виде испоняемого файла и что дальше? суть одна и таже. Есть некий player (VM), нативный для данной платформы, который и интерпретирует программу.
>По сравнению с чем угодно. Они другие. А то что в 2.0 появился XP l&f, так и в свинге есть такой.
там точно такой же binding на winforms, как в mfc.
Просто на старые виджеты. Теперь добавили и на новые XP.
В любом случае это убожество, хотябы из-за отсутствия нормального layout. Однако суть не в этом. Глядя на яву сразу можно сказать, что это и ЯВА с ее идиотскими закладками, кнопками и прочими мутными виджетами. Глядя на приложение на mono никогда не скажешь, это моно или обычное gtk приложение.
Не пойму, чего ты так в этот моно вцепился ? Gtk и привычный (когда оно так, и привычный на самом деле для кого ?) l&f это хорошо, а что если я хочу написать раз и потом не думать что оно где-то там может не работать ? Всетаки gtk-sharp, вещь платформо-зависимая и без сборки для каждой платформы не получится. (Если не ошибаюсь, нельзя взять тоже приложения собранное с gtk-sharp под Win*, доставить тот-же gtk-sharp под Linux ?)
Кстати, для жабы тоже существуют gtk биндинги (эклипс, азуреус)
Я не хочу иметь под каждую софтину или фреймворк свою настройную программу XXXset. Я хочу запускать программу и видеть ее в нормальном виде. Достали уже все эти qt/gtk/tk/swing настройщики и настройки.
Есть система, в ней есть установленная тема - вот и пользуйся ей, а не делай свой ЦУП для выбора лук-н-филов.
swing имеет смысл сравнить с wxwidgets. Типа, написали один код, а он везде в родные виджеты транслируется. Точно такая же утопия. И глючат оба одинаково.
>Всетаки gtk-sharp, вещь платформо-зависимая и без сборки для каждой платформы не получится. (Если не ошибаюсь, нельзя взять тоже приложения собранное с gtk-sharp под Win*, доставить тот-же gtk-sharp под Linux ?)
Почему нельзя. У меня в обоих системах стоит gtk-sharp и приложения работают и там и там. причем под win gtk-sharp есть и под mono и под .net
На яве можно не думать о работоспособности - оно просто нигде нормально работать не будет. Проверено на нескольких банк-клиентах, xml редакторе, ldap редакторе и еще десятке программ.
Воьзми тот же eclipse - это называется, GTK-виджеты? про скорость вообще молчу...
азуреус, пожалуй, пример хорошего приложения. Но опять незадача, явы в дистрах нет, надо ставить-гемор-неохота=нету_у_меня_азуреуса
>В Java дженерики - не более чем косметический фантик. Только для автоприведения типа в коллекциях. Например, вот так: public class MyClass<E> { private E m_E; public MyClass() { m_E=new E(); } }
на Java 5 сделать нельзя, а в С#2 можно.
Батенька, а вы представляете, как можно сделать m_E=new E() если у класса E нет конструктора E() а есть только какой-нибудь Е(int a)? Так что не надо на Java дженерики наезжать.
где As {New} - это ограничение на класс - требование наличие дефолтного конструктора. Такие ограничения можно совмещать с заданием обязательного предка. Так что тут всё в порядке.
> исходник на Java _компилируется_ в байт-код виртуальной машины, который к Java имеет довольно отстраненное отношение.
Лжешь. Семантика этой убогонькой уродской виртуальной машины есть прямое отображение семантики языка Java. И, соответственно, она очень хреново подходит для других языков, от жабки отличающихся.
При этом, CLI - гораздо более гибкая и развитая VM, в которую можно эффективно компилировать самые разнообразные языки.
Visual Studio - уёбистая хуеботина для пизданутых на голову гнидоёбищь (ну, таких вот хуёвых, как ты, жопа). Нормальные люди разрабатывают приложения под .NET, используя Emacs.
>Хватит гнать на компилятор. Cloneable не декларирует никаких методов. Весь этот интерфейс шаманство для VMа и язык тут не при чем.
Гы! Насколько видно из предыдущего обсуждения, никто и не говорил что у Clonable есть какие то методы. И про шаманство тоже правда. Невозможность обьявить протектный интерфейс на уровне пэкиджа и приводит к такому уродству. Для справки: любой объект имеет метод clone. Ты не знал? Запись < a extends Clonable > значит ОБЪЕСТ "а", который наследует или имлементирует некий "Clonable". Ключевое cлово ОБЪЕСТ означает что "а" наследует Object, а поэтому твой код здесь по барабану и только показывает что ты НЕ ПОНИМАЕШЬ дженериков в java.
>В примере с wildcard написано что параметр принимает любой мусор. Локальная переменная содержит любой мусор.
Да ну! Открытие однако! В этом примере написано, что параметр принимает любой ОБЪЕКТ, т.е. экземпляр любого класса наследованного от Object. И если далее в коде я например хочу напечатать название класса каждого второго элемента коллекции начиная с 25-го, то мне насрать на то, что там лежит. Мне нужно знать только одно - ТАМ ЛЕЖИТ нечто унаследованное от Object-а. И wildcard дает мне такую информацию.
>Cитуация с HashSet<?> элементарно разруливается как <T> DoSomethong(Set<T> s) { Set<T> copy = new HashSet<T>(s); }
Еще она разруливается так <T> DoSomethong(Set<T> s) { Set<?> copy = new HashSet<T>(s); } Вот только нахрена козе баян? Ибо
DoSomethong(Set<?> s) { Set<?> copy = new HashSet<?>(s); }
Вполне логично и должно работать.
>Мой type variable связывает все декларации воедино, а wildcard "?" не делает этого.
Ошибаешся. Все параметры дженериков - Object-ы и если больше ничего не нужно, то "?" вполне достаточно.
> Насколько видно из предыдущего обсуждения, никто и не говорил что у Clonable есть какие то методы.
Аффтар опуса на DW почемуто ожидал что если он напишет class A<C extends Cloneable> то у C c; появиться метод clone().
>Вполне логично и должно работать.
Дядя прочитай статью да?
Чего ты хочешь добиться вот этим new HashSet<?>(s) с точки зрения параметрического полиморфизма?
>Мне класса каждого второго элемента коллекции начиная с 25-го, то мне насрать на то, что там лежит.
Вот и написано Set<?> s;
При чем тут инстанциирование с wildcard?
уж не говоря о том что ни о каком defensive copy с такой вайлдкардой говорить не приходится.
>Ошибаешся.
Дядя прочитай хотябы элементарный туторил по генерикам, а потом неси чушь. Если у тебя "все параметры генериков" Object-ы тогда пиши Set<Object> а не страдай с вайлдкардами...
Весь смысл параграфа "Constructing wildcard references" можно сформулировать так "если я хочу сделать через жопу то, что не решает никаких задач, то жава мне этого не дает."
Или ты просто хочешь иметь возможность вызывать new HashSet<?>() без всякого отдельного семантического смысла, и чтобы это было тем же самым что и new HashSet<Object>()?
>Аффтар опуса на DW почемуто ожидал что если он напишет class A<C extends Cloneable> то у C c; появиться метод clone().
interface I {
void i();
}
interface J {
void j();
}
public class T {
<A extends I, B extends J> void mlya( A a, B b) {
boolean f = a.equals(b);
boolean f1 = b.equals(a);
String s = a.getClass().getName();
// и т.п.
}
}
Где у I или e J матоды Object-а?
Про параною с "?" желания говорить НЕТ. И вообще сказал же ХОРОШ ТОЛОЧ ВОДУ В СТУПЕ! Я тебе больше не отвечаю. Адью.
Captain Pedantic.