Generics двух разных типов

Модератор: Absurd

Ответить
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Можно ли в J2SE5 написать что-то такого рода: Structure<V1, V2 != V1> :?:

Я знаю, что этот синтаксис неправильный, а вот как правильно написать?

Мне это нужно примерно для следующего кода

Код: Выделить всё

import java.util.*;

public class Structure<V1, V2> {

	private ArrayList<V1> v1 = new ArrayList<V1>();
	private ArrayList<V2> v2 = new ArrayList<V2>();

	public boolean contains(V1 v1Object) {
		return v1.contains(v1Object);
	}

	public boolean contains(V2 v2Object) {
		return v2.contains(v2Object);
	}
}
Компилятор писал(а):Structure.java:8: name clash: contains(V1) and contains(V2) have the same erasure
public boolean contains(V1 v1Object) {
^
Structure.java:12: name clash: contains(V2) and contains(V1) have the same erasure
public boolean contains(V2 v2Object) {
^
2 errors
Причём следующую структуру он понимает без проблем!

Код: Выделить всё

import java.util.*]

Из этого могу сделать вывод, что мне нужно всего лишь доказать, что V1 и V2 имеют  разные типы (что и должно быть из условий постановки задачи).

Есть ли какие-нибудь идеи?

[i]P.S. переименовать методы в v1contains и v2contains - я могу, но мне не нравится такое решение[/i]  :lol:
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Ура, товарищи! :lol:

Не прошло и пол года, как я дорос до решения этой задачки :wink:

Код: Выделить всё

public interface T1 {}

Код: Выделить всё

public interface T2 {}

Код: Выделить всё

import java.util.ArrayList;

public class Structure<V1 extends T1, V2 extends T2> {

	private ArrayList<V1> v1 = new ArrayList<V1>();

	private ArrayList<V2> v2 = new ArrayList<V2>();
	
	public Structure(V1 v1Object, V2 v2Object) {
		v1.add(v1Object);
		v2.add(v2Object);
	}
	
	public boolean contains(V1 v1Object) {
		return v1.contains(v1Object);
	}

	public boolean contains(V2 v2Object) {
		return v2.contains(v2Object);
	}

}

Код: Выделить всё

public class Edge implements T1, T2 {}

Код: Выделить всё

public class Node implements T1, T2 {}

Код: Выделить всё

public class GraphEdgeNode extends Structure<Edge, Node> {

	public GraphEdgeNode(Edge edge, Node node) {
		super(edge, node);
	}

}

Код: Выделить всё

public class GraphNodeEdge extends Structure<Node, Edge> {

	public GraphNodeEdge(Node node, Edge edge) {
		super(node, edge);
	}
	
}

И такая вот одна небольшая деталька, которая меня обрадовала добросовестностью Java-Developer_ов, и расстроила препятствию моему вечному желанию найти ошибку :o ops:

Такие вот шутки:

Код: Выделить всё

public class GraphNodeNode extends Structure<Node, Node>{}

Код: Выделить всё

public class GraphEdgeEdge extends Structure<Edge, Edge>{}
компилятор не пропускает (за что ему и спасибо).

P.S. только я уже написал код, используя v1contains и v2contains, а учитывая то, что GETэры всё равно пришлось бы в такой форме писать, - вряд ли я буду это переделывать ...
jk
Сообщения: 26
Зарегистрирован: 22 дек 2004, 10:15
Контактная информация:

ну ты маньяк ;)
Ответить