Genericita a dedičnost – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Genericita a dedičnost – Java – Fórum – Programujte.comGenericita a dedičnost – Java – Fórum – Programujte.com

 

NotBeginner
~ Anonymní uživatel
185 příspěvků
16. 7. 2014   #1
-
0
-

 Ahojte, hraji si generickou ohraničenou třidou. Mám problém v metode zjistiDelku1(). Nedaří se mi v té metodě v objektu info získat přístup k metodě getText(). Kompilator mi nebere ani přetypování objektu. Napadá vás někoho jak na to?

package kapitola21_GenerickeTypy;
class PredekTrida01{	}
class Potomek01Trida extends PredekTrida01  {
	... nějaký kód
}
class Potomek02Trida extends PredekTrida01 {
	private String text;
	protected Potomek02Trida(String text) { this.setText(text); }
	public String getText() {	return text;	}
	public void setText(String text) {	this.text = text;	} 
	public String toString() { return "text : "+text; }
}
class GenerickaTridaDedicna01<T extends PredekTrida01> {
	private T temp;
	protected GenerickaTridaDedicna01(T temp){
		this.temp=temp;	}
	protected void zjistiDelku1(GenerickaTridaDedicna01<T> info){
		Potomek01Trida temp1;
		Potomek02Trida temp2;
		if(this.temp instanceof Potomek01Trida) {
		/****** ZDE CHCI MIT PRISTUP U OBJEKTU info k metode getText	
			System.out.println(((Potomek02Trida)info).getText());	// nefunguje
			temp2 = (Potomek02Trida) info;		// nefunguje
		}
	}
}
public class R07_ZastupnyParametr {
	public static void main(String args []){
		GenerickaTridaDedicna01<PredekTrida01> objekt1 = new GenerickaTridaDedicna01<PredekTrida01>(new Potomek01Trida(35));
		GenerickaTridaDedicna01<PredekTrida01> objekt2 = new GenerickaTridaDedicna01<PredekTrida01>(new Potomek02Trida("Ahoj jak se má??"));
		objekt1.zjistiDelku1(objekt2);
	}
}
Nahlásit jako SPAM
IP: 217.112.161.–
KIIV
~ Moderátor
+43
God of flame
16. 7. 2014   #2
-
0
-

nemel bys mit v ty podmince spis instanceof Potomek02Trida ? takhle to pak zkousis nad jinou tridou a to by fungovat nemelo

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
NotBeginner
~ Anonymní uživatel
185 příspěvků
16. 7. 2014   #3
-
0
-

Nevím jestli jsem tě pochopil správně.

Ale if podmínka instanceof je tam jenom pro zabezpečení(kontrolu) this.temp objektu. Měl jsem v plánu naprogramovat kontoly pro všechny varianty potomků a pak zavolat nějaký getter metodu potomka.

Ale z důvodu zjednodušení a názorného vyjádření problému jsem ten kód ořezal na nezbytné funkční pochopitelné minimum.

Jestli máš nápad(myšlenku) jak zmodifikovat pouze metodu zjistiDelku1() hod to sem. Ten problém by se mohl dát vyřešit statickou getText a z menší úpravou celkového řešení ale preferuji tuto cestu s objektovým přístupem.

Pozn. ono je možné Java tento směr způsobu řešení nemusí ani dokázat.

Nahlásit jako SPAM
IP: 217.112.161.–
NotBeginner
~ Anonymní uživatel
185 příspěvků
16. 7. 2014   #4
-
0
-

 A pokud jsi myslel tuto myšlenku :

protected void zjistiDelku1(GenerickaTridaDedicna01<T> info){
	Potomek01Trida temp1;
	Potomek02Trida temp2;
	int velikost2;
	if(info instanceof Potomek02Trida) {
   	
	}

Hodí to toto :

~Incompatible conditional operand types GenerickaTridaDedicna01<T> and Potomek02Trida

Což samozřejmě obejdeme tímto způsobem  ( řešení na stackoverflow ) ale ani mi neumožní přetypovat a získat přístup k metodě getText()

 if(info.getClass().equals(Potomek02Trida.class)) {

 }
 

Nahlásit jako SPAM
IP: 217.112.161.–
Beginner
~ Anonymní uživatel
5 příspěvků
16. 7. 2014   #5
-
0
-

#4 NotBeginner
Otázka:

Z akého dôvodu je parametrom metody zjistiDelku1 objekt triedy, v ktorej je táto metóda definovaná? Teda, prečo je to definované takto:
protected void zjistiDelku1(GenerickaTridaDedicna01<T> info)
a nie takto:
protected void zjistiDelku1(T info)

?
 

Nahlásit jako SPAM
IP: 212.24.155.–
p3can
~ Anonymní uživatel
312 příspěvků
16. 7. 2014   #6
-
0
-

nema byt misto

if(this.temp instanceof Potomek01Trida) {
		/****** ZDE CHCI MIT PRISTUP U OBJEKTU info k metode getText	
			System.out.println(((Potomek02Trida)info).getText());	// nefunguje
			temp2 = (Potomek02Trida) info;		// nefunguje
		}

spis toto ?

Nahlásit jako SPAM
IP: 77.92.213.–
p3can
~ Anonymní uživatel
312 příspěvků
16. 7. 2014   #7
-
0
-

   

if(this.temp instanceof Potomek01Trida) {
		/****** ZDE CHCI MIT PRISTUP U OBJEKTU info k metode getText	
			System.out.println(((Potomek02Trida)info.temp).getText());	// nefunguje
			temp2 = (Potomek02Trida) info.temp;		// nefunguje
		}
Nahlásit jako SPAM
IP: 77.92.213.–
NotBeginner
~ Anonymní uživatel
185 příspěvků
16. 7. 2014   #8
-
0
-

#7 p3can

Ano, má být ... zrovna před 10 minutami mě to napadlo. Chtěl jsem napsat jaké jsme ostudy že jsme si toho nevšimli. Aspoň že ty sis toho všiml.

Nahlásit jako SPAM
IP: 217.112.161.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

Java-genericita — založil Boxxer

Dědičnost — založil Bobek

Dědičnost — založil cheeester

Dedicnost ... — založil Koudis

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý