Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленький тест, :) 
:(
    Опции темы
LSD
Дата 16.9.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Если бы было нельзя, я бы не спрашивал smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
NotGonnaGetUs
Дата 17.9.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 4
Всего: 12



Это вопрос про ковариантость в java 1.5? 

В классе наследнике может быть два метода с разными возращаемыми типами, один из которых отмечен как "синтетический".
Но в исходнике этого метода не увидеть...
PM MAIL   Вверх
Bozo
Дата 17.9.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 5.4.2006

Репутация: нет
Всего: нет



Цитата(LSD @ 16.9.2006,  10:12)
Можно ли создать в классе 2 метода у которых будут одинаковые имена и параметры и которые будут различаться только типов возвращаемого значения?
Что-то наподобие такого:
Код
public class Test
{
  public String get()
  {
    return null;
  }

  public Object get()
  {
    return null;
  }
}

Ну если ты имеешь в виду String<Object, то наверное вот эта ссылка http://www.java-tips.org/java-se-tips/java...turn-types.html поможет
PM   Вверх
powerOn
Дата 17.9.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(LSD @  16.9.2006,  11:12 Найти цитируемый пост)
Можно ли создать в классе 2 метода у которых будут одинаковые имена и параметры и которые будут различаться только типов возвращаемого значения?


Можно. Вот код:

Код

import java.lang.reflect.Method;

public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    public static void main(String[] args) {
        // TODO code application logic here
       B b = new B();
       for(Method m : b.getClass().getMethods()) {
           System.out.println(m.toGenericString());
       };
    }
}

class A {
    public Object m() {
        System.out.println("Object returned!!");
        return new Object();
    }
}
class B extends A {
    public String m() {
        System.out.println("String returnned!!");
        return new String();
    }
}


Вот результат выполнения:
Цитата

public java.lang.String neuronweb.B.m()
public java.lang.Object neuronweb.B.m()

public native int java.lang.Object.hashCode()
public final native java.lang.Class<?> java.lang.Object.getClass()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()




--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 17.9.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Именно это я и имел в виду smile 
Хотя мой пример был с параметризованным классом, но суть та же.
Код
public class SyntTest
{
  public static void main(String[] args)
  {
    try
    {
      System.out.println(A.class);
      Method[] methods = A.class.getDeclaredMethods();
      for(Method method : methods)
        System.out.println(method + " is synthetic = " + method.isSynthetic());
      System.out.println();

      System.out.println(B.class);
      methods = B.class.getDeclaredMethods();
      for(Method method : methods)
        System.out.println(method + " is synthetic = " + method.isSynthetic());

    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }

  public interface A<T>
  {
    public T get();
  }

  public class B implements A<String>
  {
    public String get()
    {
      return "Bla-bla-bla";
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Се ля ви
Дата 21.10.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



В мои руки попал довольно красивый тестик из пяти задачек. Мне кажется, в этом разделе их ещё не было.

По каждому пункту ответьте на 2 вопроса:
    - Скомпилится ли программа?
    - Если нет то почему, если да, то что будет на экране?

Сначала ответьте, а потом проверьте smile

Код
public class Test1 {
    public static void main(String[] args) {
        int i = 0;
        System.out.println("5/i=" + 5/i);
    }
}


Код
public class Test2 {
    public void test(String s) {
        System.out.println("string");
    }
    public void test(Object o) {
        System.out.println("objectM");
    }
    public static void main(String[] args) {
        Test2 t = new Test2();
        t.test(null);
    }
}


Код
public class Test3 {
    public static void main(String[] args) {
        double i = 0;
        System.out.println("5/i=" + 5/i);
    }
}


Код
public class Test4 {
    private int k = 5;
    
    public static void main(String[] args) {
        Test4 t = new Test4();
        t.k = 7;
        System.out.println("k = " + t.k);
    }
}


Код
public class Test5 extends A {
    public static String s = "test";
    public void test() {
        System.out.println("Test.test: s = " + s);
    }
    public static void main(String[] args) {
        A t = new Test5();
        System.out.println("A.s = " + t.s);
        t.test();
    }
}
class A {
    public static String s = "a";
    public void test() {
        System.out.println("A.test: s = " + s);
    }
}


Это сообщение отредактировал(а) Се ля ви - 22.10.2006, 03:16


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
powerOn
Дата 21.10.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



1) Первое что подумал: Нифига не с компилируется. 
    Второе что подумал: А вдруг???
Первое чувство было верным... int i - 0; компилятор говорит не хватает ";"

2) Тут string напечатает. Но я не помню почему, вроде где-то читал, что в подобных случаях (существуют методы, параметры которых имеют наследственные связи) принято вызывать метод принимающий аргумент с наиболее узким типом. По крайней мере, вот такой пример:
Код

public class NewClass {
   //2.

    public void test(Map s) {
        System.out.println("Map");
    }
    
    public void test(HashMap s) {
        System.out.println("HashMap");
    }
    
    public void test(Object o) {
        System.out.println("objectM");
    }
    public static void main(String[] args) {
        NewClass t = new NewClass();
        t.test(null);
    }
}

выдал HashMap.  smile А вот такой код:
Код

public class NewClass {
   //2.
    public void test(String s) {
        System.out.println("Map");
    }
    
    public void test(HashMap s) {
        System.out.println("HashMap");
    }
    
    public void test(Object o) {
        System.out.println("objectM");
    }
    public static void main(String[] args) {
        NewClass t = new NewClass();
        t.test(null);
    }
}


уже не компилируется.

3) Infinity. Это в любой нормальной книге по Java написано.

4) Это так же написано в любой уважающей себя книге по Java. Объект может обращаться к закрытым полям внутри своих методов. И этот случай не исключение.

5) Это классический пример работы полиморфизма в Java. Для методов идет динамический поиск метода по типу объектов, а для полей такого нет. Для полей тип ссылки будет определяющим.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Се ля ви
Дата 22.10.2006, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Цитата(powerOn @  21.10.2006,  18:42 Найти цитируемый пост)
1) Первое что подумал: Нифига не с компилируется. 
    Второе что подумал: А вдруг???
Первое чувство было верным... int i - 0; компилятор говорит не хватает ";"

Я это дело сканил и распознавал - просто не заметил глюка... Сорри smile Вообще-то там "=", а не "-" - я сейчас в посте исправил.

Цитата(powerOn @  21.10.2006,  18:42 Найти цитируемый пост)
Тут string напечатает. Но я не помню почему, вроде где-то читал, что в подобных случаях (существуют методы, параметры которых имеют наследственные связи) принято вызывать метод принимающий аргумент с наиболее узким типом.

Тут просто учитывается глубина дерева наследования. Вызовется метод, аргумент которого дальше всех отстоит от Object.

Объяснение тоже простое - когда JVM ищет, какой из перегруженных методов ей вызвать, она выстраивает их именно в порядке, соответствующем глубине наследования, что бы самые глубокие наследники были впереди и пробует привязать вызов к каждому, вызывая первый, который подойдёт. С null`ом, естественно, подойдёт любой, так что вызывается первый в этом порядке smile


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
LSD
Дата 24.10.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Се ля ви @  22.10.2006,  03:32 Найти цитируемый пост)
Объяснение тоже простое - когда JVM ищет, какой из перегруженных методов ей вызвать, она выстраивает их именно в порядке, соответствующем глубине наследования, что бы самые глубокие наследники были впереди и пробует привязать вызов к каждому, вызывая первый, который подойдёт. С null`ом, естественно, подойдёт любой, так что вызывается первый в этом порядке 

Ничего подобного smile 

На этапе компиляции компилятор решает метод с какой сигнатурой вызвать. Сигнатуры у методов public void test(String) и public void test(Object) различны, и какой из методов вызвать решает компилятор. Проверить просто:
Код
public class Test2
{
  public void test(CharSequence s)
  {
    System.out.println("CharSequence");
  }

  public void test(Object o)
  {
    System.out.println("Object");
  }

  public static void main(String[] args)
  {
    Test2 t = new Test22();
    t.test(null);
  }
}

class Test22 extends Test2
{
  public void test(String s)
  {
    System.out.println("String");
  }
}

Получим "CharSequence", а не "String". Это то что называется перегруженными функциями. 

Такое поведение нужно, чтобы разруливать подобные типы конфликтов:
Код
public class Test2
{
  public void test(CharSequence s)
  {
    System.out.println("CharSequence");
  }

  public void test(Comparable o)
  {
    System.out.println("Comparable");
  }

  public void test(String o)
  {
    System.out.println("String");
  }

  public static void main(String[] args)
  {
    Test2 t = new Test2();
    t.test("");
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LSD
Дата 28.10.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Если взять стандартный класс java.util.Date и посмотреть его исходный код:
Код
public boolean equals(Object obj)
{
  return obj instanceof Date && getTime() == ((Date) obj).getTime();
}

то будет видно, что он нарушает контракт для метода equals().

Вопрос: в что именно тут не так?
smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 28.10.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Может, ты имеешь в виду что нет проверки obj на null (в этом случае должен возвращаться false, а здесь будет NullPointerException)?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 28.10.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(batigoal @  28.10.2006,  23:36 Найти цитируемый пост)
Может, ты имеешь в виду что нет проверки obj на null (в этом случае должен возвращаться false, а здесь будет NullPointerException)?

Нет не будет, instanceof возвращает false если ссылка равна null.
Так что с этим все в порядке smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
w1nd
Дата 30.10.2006, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(LSD @  28.10.2006,  22:23 Найти цитируемый пост)
Если взять стандартный класс java.util.Date и посмотреть его исходный код <...> то будет видно, что он нарушает контракт для метода equals().

Раскалывайтесь, LSD, что имели в виду. Я никаких нарушений (кроме потенциальных - если взглянуть, например, на java.sql.Timestamp) не вижу.

Это сообщение отредактировал(а) w1nd - 30.10.2006, 01:52


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
LSD
Дата 30.10.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Именно в свете наличия java.sql.Timestamp эта ошибка и появляется. В доке написано:
Цитата
The equals method implements an equivalence relation on non-null object references:
  • It is reflexive: for any non-null reference value x, x.equals(x) should return true. 
  • It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true. 
  • It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true. 
  • It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified. 
  • For any non-null reference value x, x.equals(null) should return false.

т.е. в данном случае была нарушена симметричность.
Код
long now = System.currentTimeMillis();
java.util.Date date = new java.util.Date(now);
java.sql.Timestamp timestamp = new java.sql.Timestamp(now);
System.out.println("date.equals(timestamp) = " + date.equals(timestamp));
System.out.println("timestamp.equals(date) = " + timestamp.equals(date));



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
NotGonnaGetUs
Дата 31.10.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 25.2.2005
Где: Москва

Репутация: 4
Всего: 12



Цитата(LSD @  30.10.2006,  09:12 Найти цитируемый пост)
т.е. в данном случае была нарушена симметричность.


Так нарушение-то в Timestamp, а не Date.

Если бы метод Equals не был переопределён с нарушением контракта метода Equals объекта Date, то всё было бы "хорошо".


Код

if (ts instanceof Timestamp) {
    return this.equals((Timestamp)ts);
      } else {
    return false;
      }

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.