2015-12-04 3 views
2

Я совершенно новый в JAVA, и я не понял, что линия говорит о «Item temp = (Item) obj;». Что означает «(Пункт)»? Заставляет ли он изменять тип объекта? Пожалуйста, помогите мне разобраться, спасибо!JAVA: тип элемента изменения

public class Item implements Comparable { 
    private String id; 
    private String name; 
    private double retail; 
    private int quantity; 
    private double price; 

    Item(String idIn, String nameIn, String retailIn, String quanIn) { 
     id = idIn; 
     name = nameIn; 
     retail = Double.parseDouble(retailIn); 
     quantity = Integer.parseInt(quanIn); 

     if (quantity > 400) 
      price = retail * .5D; 
     else if (quantity > 200) 
      price = retail * .6D; 
     else 
      price = retail * .7D; 
     price = Math.floor(price * 100 + .5)/100; 
    } 

    public int compareTo(Object obj) { 
     Item temp = (Item)obj; 
     if (this.price < temp.price) 
      return 1; 
     else if (this.price > temp.price) 
      return -1; 
     return 0; 
    } 
    public String getId() { 
     return id; 
    } 
    public String getName() { 
     return name; 
    } 
    public double getRetail() { 
     return retail; 
    } 
    public int getQuantity() { 
     return quantity; 
    } 
    public double getPrice() { 
     return price; 
    } 
} 
+0

Да, вы правы. Он называется преобразованием типов – omer727

ответ

2

Item temp = (Item)obj;type conversion выполняет (или типажей) Object obj к типу Item. Если obj не является Item, то он бросит ClassCastException, то Javadoc из которых говорит (частично)

Брошенный, чтобы указать, что код попытался бросить объект к подклассу, которого он не является пример. Например, следующий код генерирует ClassCastException:

Object x = new Integer(0); 
System.out.println((String)x); 

Однако, поскольку Comparable является общим, это также можно сделать Item как

public class Item implements Comparable<Item> 

, а затем compareTo(Item) как

@Override 
public int compareTo(Item temp) { 
    return Double.compare(this.price, temp.price); 
    // if (this.price < temp.price) 
    //  return 1; 
    // else if (this.price > temp.price) 
    //  return -1; 
    // return 0; 
} 
+1

Спасибо, это очень четкое объяснение! –

+0

@EricHsieh Если этот ответ на ваш вопрос, вы должны подумать о принятии ответа. –

0

Эта строка: Item temp = (Item) obj; Взятие другого объекта этого класса для сравнения. Это для сортировки группы/списка объектов класса объектов. Итак, когда мы отсортируем список предметов, он возьмет этот (текущий) объект с объектом-передатчиком этого класса.

0

Это известное как литье (в основном его разделение на два типа: & Up Casting). Кастинг позволяет использовать общее программирование на Java, , где код написан для работы со всеми объектами классов, происходящих из некоторого базового класса (часто java.lang.Object, для служебных классов). Однако использование кастинга вызывает уникальный набор проблем. Если вы попытаетесь наложить два объекта, которые не имеют одинаковой иерархии типов, т. Е. Между ними нет родительских отношений между дочерними элементами, вы получите ошибку времени компиляции. другой рукой, если вы набираете объекты литья из иерархии того же типа, но объект, который вы выполняете, не имеет того же типа, на котором вы выполняете кастинг, тогда он будет бросать ClassCastException в Java.

И @Elliot уже объяснил это на примере

+0

Большое спасибо !!!! –

+0

'Casting позволяет использовать универсальное программирование в Java': это никогда не является основной причиной кастинга. И объяснение ошибки времени компиляции также не очень точно. –

+0

@AdrianShum yes its right Generic Progamming не является основной причиной Object Casting, но его падение по одной из причин. Если класс Base и Derived не связан друг с другом и не является частью иерархии одного и того же типа, то бросает ошибку компиляции. например, вы не можете использовать String и StringBuffer, так как они не из иерархии одинакового типа. – Zia

Смежные вопросы