CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[JAVA] Problème de typage avec un Vector

jenaipasdenom
jenaipasdenom
Niveau 15
04 mars 2011 à 16:56:47

Salut.
Alors en fait ,on a un exercice dans lequel on nous demande de créer plusieurs classes ,et parmi celles ci on a une classe prenant comme attribut un objet de type Vector. Cette classe a plusieurs méthodes dont une méthode premierElement() qui me pose quelques soucis.
J'ai essayé d'appeler la méthode firstElement() de l'attribut de la classe ,mais le compilateur m'affiche un :
incompatible types
found : java.lang.Object
required: Carte
return lesCartes.firstElement();
^
Pourtant ,pas de problème pour le type de retour de la méthode (un objet de type Carte) et j'appelle bien la méthode d'un objet Vector définit dans l'API ,alors j'admet que je sais pas trop quoi faire là.

_skip
_skip
Niveau 10
04 mars 2011 à 17:40:00

Poste du code...

jenaipasdenom
jenaipasdenom
Niveau 15
04 mars 2011 à 17:44:21

Voila la classe complète :

class Tas{
private Vector lesCartes;

Tas(){
this.lesCartes=new Vector();
}
public Carte premiereCarte(){
return lesCartes.firstElement();
}
public void ajouterCarte(Carte laCarte){
lesCartes.addElement(laCarte);
}
public boolean estVide(){
return lesCartes.isEmpty();
}
public String toString(){
return lesCartes.toString();
}
}

godrik
godrik
Niveau 30
04 mars 2011 à 17:49:17

Vector renvoie un Object pas un Carte. Comme tu sais que tu ne stocke que des Carte dans ton vecteur, tu peux faire un cast.

Cependant, on dirait que tu utilises une version de java inferieur a 1.5 puisque tu peux utiliser Vector sans generics. Et il me semble que ce n'etait pus possible depuis 1.5. Je te conseille donc de mettre a jour ton environnement de programmation java.

jenaipasdenom
jenaipasdenom
Niveau 15
04 mars 2011 à 17:57:11

Bah je suis sous Jav

jenaipasdenom
jenaipasdenom
Niveau 15
04 mars 2011 à 18:01:04

Pardon ,ça s'est posté tout seul.
Donc je disais : Je suis sous Java SE 6 ,et j'ai installé l'environnement Java il n'y a pas si longtemps que ça :(

Sinon ,un cast parce que je ne met que des objets Carte dans mon vecteur ? On a commencé l'algo orienté objet il y a peu de temps ,donc je ne suis pas encore au point sur tous les termes ,tu peux m'expliquer concrètement ce que c'est ,avec un petit bout de code pour illustrer ?

saleGauss
saleGauss
Niveau 9
04 mars 2011 à 18:54:59

A l'heure actuelle, tu utilises vector, sans précision. TU ne dis pas lorsque tu le declare s'il s'agit d'un vecteur de patates ou de poirots.
Donc pour Java, ca sera le plus général : un vecteur d'Object.
Alors qu'en réalité, le Vector prédéfini est prévu pour être un type générique : tu lui donne un type T, et il t'instancie Vector<??> en un Vector<T>.
On dit que Vector est générique : il marche pour plusieurs types d'elements différents.

Ce que Godrik veut dire c'est que comme tu sais que tu as des Carte dans ton vector, tu pourrais faire un cast de l'objet que tu recuperes (de type Object) en un Carte sans trop de risque.
Cela puisque tu sais que tu as mis dedans des Cartes.

Cependant, cela reste une méthode salle, peu sécurisante, et une très mauvaise habitude de programmation.
Car si un jour tu castes quelque chose en quelque chose d'autre sans aucun sens sémantique, tu planteras ton programme.
Personnellement, un cast = -2 points. ( :p)

Conclusion : utilise un vector de Carte directement :
private vector<Carte> lesCartes = new Vector()
ou
private vector<Carte> lesCartes = new Vector<Carte>()

(je ne suis plus sur de la syntaxe, longtemps que j'ai pas fais du Java.)

Ainsi, tu utiliseras un vector de Cartes, et les methodes prédéfinies sur les vector (dont firstElement, ...) renverront un Carte au lieu d'un pauvre Object...

J'espère t'avoir introduis la notion de généricité pas trop violemment :p

Vas lire qq trucs sur internet concernant les collections génériques, tu y apprendras plein de choses.

Paulop
Paulop
Niveau 12
04 mars 2011 à 18:57:36

une cast c'est pour changer le type d'un objet en une autre.
Une manière de le faire, c'est de placer un "(type)" devant ton objet.

Sans doute que tu verras les generics plus tard dans tes cours, ils permettent de s'assurer que tous les objets contenus dans ton vector sont du même type. Si tu entres un objet qui n'est pas du bon type, le compilateur te le signales.

Théoriquement ça devrait s'utiliser comme ça :
private Vector<Carte> Cards;
Puis l'instanciation :
Cards = new Vector<Carte>();

godrik
godrik
Niveau 30
04 mars 2011 à 19:01:32

(il me semblait que Vector snas specifie le type etait deprecie en java maintenant. Et que le compilateur t'insultait snas generer de binaire.)

jenaipasdenom
jenaipasdenom
Niveau 15
04 mars 2011 à 19:06:52

Ah ! C'est ce qu'ils appelaient le transtypage dans notre CM. D'ailleurs ,nos profs n'aiment pas trop ça sauf quand c'est absolument nécessaire.
Et merci saleGauss ,je savais pas qu'on pouvait spécifier le type d'objet d'un vecteur ainsi. Je s'avais qu'on pouvait (devait) le faire pour un tableau ,mais pour la classe Vecteur ,je savais pas comment faire.

_skip
_skip
Niveau 10
05 mars 2011 à 11:34:46

En effet, les collections fourre-tout (dont le contenu est hétérogène et ne partage aucune interface) sont admis comme code smell, ainsi que les cast sauf quand ils sont incontournables.

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment