Obiekt w funkcji, interfejs

0

Witam,

borykam się z pewnym problemem, a raczej niewiedzą jak zapisać. Posiadam Interfejs Vectorable i klasę Vector2D.

public interface Vectorable {

	public void add(Vector2D vec);
}
public class Vector2D implements Vectorable{

	private double x;
	private double y;

	Vector2D(double x, double y) {
		setX(x);
		setY(y);
	}

	@Override
	public void add(Vector2D vec) {
		x = vec.getX();
		y = vec.getY();
	}
        //Settery, gettery

}

Wszystko wygląda niby ładnie pięknie, ale jakbym chciał zaimplementować ten interfejs dla klasy Vector3D nie miałby sensu. Nie można dodawać wektorów, które są w różnych wymiarach.

Pytanie brzmi następująco, w jaki sposób mogę w interfejsie zaznaczyć, aby argument funkcji przyjmował typ klasy, która implementuje interfejs?

public interface Vectorable {

	public double length();
	public void add(? vec); // Argument nazwany po klasie dziedziczącej
}
1

Mozesz użyć do tego generica:

interface Vectorable<T extends Vectorable<T>> {
    public double length();
    public void add(T vec);
}

I masz wtedy klasę

public class Vector2D implements Vectorable<Vector2D>{
//
}

Ale to cie wcale nie chroni przez potworkiem w stylu:

public class Vector3D implements Vectorable<Vector3D>{
//
}

public class Vector2D implements Vectorable<Vector3D>{
//
}

;] Ale nic więcej sie tu zrobić chyba nie da.

0

Elegancko, a jest jeszcze inna możliwość?
Lubię znać kilka sposobów :P

2

Inna możliwość jest taka, że nie robisz tego bezsensownego interfejsu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1