#java #generics #coordinates #distance #point
#java #общие #координаты #расстояние #точка
Вопрос:
Я должен возвращать расстояние от (0,0)
точки до this
точки, а метод distance должен возвращать расстояние от this
до p
. Я новичок в Java и универсальных классах / методах. В моем методе расстояния есть ошибка, но я думаю, что я на правильном пути. Методы в CharNumber
должны возвращать значение частного поля aChar
и преобразовывать его в числовые значения.
public class Point <T extends Number> {
private T x;
private T y;
public Point(T x, T y){
}
public T getX() {
return x;
}
public T getY() {
return y;
}
public double radius(){
return Math.sqrt(
Math.pow(x.doubleValue() - 0.0, 2)
Math.pow(y.doubleValue() - 0.0,2));
}
public double distance(Point p){
return Math.sqrt(
Math.pow(this.x.doubleValue() - p.getX(), 2)
Math.pow(this.y.doubleValue() - p.getY(), 2));
}
@Override
public String toString() {
return "Point{"
"x=" x
", y=" y "}";
}
}
public class CharNumber extends java.lang.Number {
private char aChar;
public CharNumber(char c){// FIXME: 10/10/16
}
@Override
public String toString() {
return "CharNumber{"
"aChar=" aChar "}";
}
@Override
public int intValue() {
return 0;
}
@Override
public long longValue() {
return 0;
}
@Override
public float floatValue() {
return 0;
}
@Override
public double doubleValue() {
return 0;
}
}
ОБНОВЛЕННЫЙ КЛАСС POINT
public class Point <T extends Number> {
private T x;
private T y;
public Point(T x, T y){
this.x = x;
this.y = y;
}
public T getX() {
return x;
}
public T getY() {
return y;
}
public double radius(){
return Math.sqrt(Math.pow(x.doubleValue()-0.0, 2) Math.pow(y.doubleValue()-0.0,2));
}
public double distance(Point<Number> p){
return Math.sqrt(Math.pow(this.x.doubleValue() - p.getX().doubleValue(),2)
Math.pow(this.y.doubleValue() - p.getY().doubleValue(),2));
}
@Override
public String toString() {
return "Point{"
"x=" x
", y=" y
'}';
}
public static void main(String args[]){// FIXME: 10/10/16
Point<Integer> p = new Point<>(1,1);
Point<Double> p2 = new Point<>(2.5,3.4);
Point<CharNumber> p3 = new Point(5,6);
System.out.println(p);
System.out.println(p2);
System.out.println(p3);
}
}
Как мне вызвать методы distance и radius в моем основном методе?
Комментарии:
1. Используйте
p.getX().doubleValue()
иp.getY().doubleValue()
.2. Вместо этого.x.doubleValue() — p.getX(),2?
3. Вместо этого при использовании
p.getX()
вам нужно будет использоватьp.getX().doubleValue()
. Аналогично для значений Y.4. Помните о
hypot
методе вMath
классе. Это часто более точно, чем все это возведение в квадрат и извлечение квадратного корня.
Ответ №1:
Конструктор должен присваивать полям.
private final T x;
private final T y;
public Point(T x, T y) {
this.x = x;
this.y = y;
}
И
private final char aChar;
public CharNumber(char c) {
aChar = c;
}
И как прокомментировано:
public <U extends Number> double distance(Point<U> p) {
return Math.sqrt(Math.pow(x.doubleValue() - p.getX().doubleValue(), 2)
Math.pow(y.doubleValue() - p.getY().doubleValue(), 2));
}
или даже
public <U extends Number> double distance(Point<U> p) {
return Math.hypot(x.doubleValue() - p.x.doubleValue(),
y.doubleValue() - p.y.doubleValue());
}
Если класс Point является неизменяемым, не может изменять свои координаты, то поля можно сделать окончательными. Это позволяет назначать переменные друг другу (совместно использовать значения точек).
Параметр Point также должен быть типизирован в общем виде.
Остается несколько вещей, но это вы знаете.
Комментарии:
1. В то время в вашем ответе был только первый. Я удалю свой комментарий.
2. Я не уверен, должны ли мы завершать переменные… нужно ли их доработать? Я также должен создать main, который создает точку с целочисленными значениями, одну с двойными значениями и одну со значениями CharNumber. Затем выведите возврат toString и возврат из radius из 3 созданных мной точек.
3. Было бы неплохо, если бы у вас не было таких методов, как translate / move, которые изменяют поля. Но я бы не
final
стал, если бы не подчеркивал в курсе.