/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
statisk metode i et interface
Fra : Michael Berg


Dato : 17-03-03 16:43

Hej Alle,

Er der nogen der kender årsagen til at man ikke kan erklære statiske metoder i et interface?

public interface A {
public void B(int c); // Ok
public static void D(int y); // Not allowed
}

Mvh Michael
www.key2know.dk


 
 
Michael Banzon (17-03-2003)
Kommentar
Fra : Michael Banzon


Dato : 17-03-03 19:34

Det ville ikke gi' ret megen mening... Med java.lang.Comperable
interfacet "ved vi" at alle objekter af den type har en metode
compareTo(Object) som vi kan kalde...

Altså, interfacet beskriver noget om hvad objekter af den type
kan... og, statiske metoder er ikke koblet til objekter...

Håber at det var forklaring nok...

/ Michael


"Michael Berg" <michael.berg@bergconsult.kom> skrev i en meddelelse
news:3e75ed14$0$177$edfadb0f@dread11.news.tele.dk...
Hej Alle,

Er der nogen der kender årsagen til at man ikke kan erklære statiske metoder
i et interface?

public interface A {
public void B(int c); // Ok
public static void D(int y); // Not allowed
}

Mvh Michael
www.key2know.dk



Michael Banzon (17-03-2003)
Kommentar
Fra : Michael Banzon


Dato : 17-03-03 20:15

NØJ jeg vrøvler! Håber at meningen ikke forsvinder helt...

"Michael Banzon" <anyone@anywhere.anyhow> skrev i en meddelelse
news:b554gp$nfl$1@sunsite.dk...
> Det ville ikke gi' ret megen mening... Med java.lang.Comperable
> interfacet "ved vi" at alle objekter af den type har en metode
> compareTo(Object) som vi kan kalde...
>
> Altså, interfacet beskriver noget om hvad objekter af den type
> kan... og, statiske metoder er ikke koblet til objekter...
>
> Håber at det var forklaring nok...
>
> / Michael
>
>
> "Michael Berg" <michael.berg@bergconsult.kom> skrev i en meddelelse
> news:3e75ed14$0$177$edfadb0f@dread11.news.tele.dk...
> Hej Alle,
>
> Er der nogen der kender årsagen til at man ikke kan erklære statiske
metoder
> i et interface?
>
> public interface A {
> public void B(int c); // Ok
> public static void D(int y); // Not allowed
> }
>
> Mvh Michael
> www.key2know.dk
>
>



Morten (17-03-2003)
Kommentar
Fra : Morten


Dato : 17-03-03 22:18

Michael Berg wrote:
> Hej Alle,
>
> Er der nogen der kender årsagen til at man ikke kan erklære statiske metoder i et interface?
>
> public interface A {
> public void B(int c); // Ok
> public static void D(int y); // Not allowed
> }

Et interface specificerer kun .. uhm .. det interface den
omkringliggende verden har til objekter der implementerer det. Om
metoden er static eller ej, synchronized eller ej, er
implementationsafhængigt, og hører derfor ikke hjemme i interfacet.

public interface A {
public void boo();
}

public class B implements A {
public static void boo() { ... }
}

public class C implements A {
public synchronized void boo() { ... }
}

B og C stiller samme tilgang (interface) til rådighed for andre
objekter, men på forskellige præmisser.

Mvh Morten



Peter Kirk (18-03-2003)
Kommentar
Fra : Peter Kirk


Dato : 18-03-03 15:04


"Morten" <usenet@kikobu.com> wrote in message
news:3e763b87$0$42663$edfadb0f@dread11.news.tele.dk...
> public interface A {
> public void boo();
> }
>
> public class B implements A {
> public static void boo() { ... }
> }

Det her kan man ikke.



Morten (18-03-2003)
Kommentar
Fra : Morten


Dato : 18-03-03 17:50

Peter Kirk wrote:
> "Morten" <usenet@kikobu.com> wrote in message
> news:3e763b87$0$42663$edfadb0f@dread11.news.tele.dk...
>
>>public interface A {
>> public void boo();
>>}
>>
>>public class B implements A {
>> public static void boo() { ... }
>>}
>
>
> Det her kan man ikke.
>
>

Hov. Du har ret, beklager. Det kan man naturligvis ikke da man
ikke kan tvinge implementerede metoder til at være identiske, hvorfor
de i sagens natur ikke kan være statiske. Det må vel så også være
grunden til at man ikke kan erklære statiske metoder i et
interface.




Michael Berg (19-03-2003)
Kommentar
Fra : Michael Berg


Dato : 19-03-03 20:16

Hej,

> >>public class B implements A {
> >> public static void boo() { ... }
> >>}
> >
> > Det her kan man ikke.
>
> Hov. Du har ret, beklager. Det kan man naturligvis ikke da man
> ikke kan tvinge implementerede metoder til at være identiske, hvorfor
> de i sagens natur ikke kan være statiske. Det må vel så også være
> grunden til at man ikke kan erklære statiske metoder i et
> interface.

Hvad mener du med at man ikke kan tvinge implementerede metoder til at være ens og hvad har det med static at gøre? Ja undskyld men jeg forstod ikke en bønne af det svar ..

Mvh Michael
www.key2know.dk


Stig Tanggaard (19-03-2003)
Kommentar
Fra : Stig Tanggaard


Dato : 19-03-03 21:38

En af ideerne med et interface er, at der kan være flere implementationer.
Per definition kan der kun være een implementation af en statisk metode.
Derfor giver det ingen mening at have statiske metoder i et interface.
Isåfald ville det kun være muligt at have een implementerende klasse....
Men hvordan skulle man vælge hvilken implementation (af den statiske metode)
der er gyldig hvis du har 2 klasser der implementerer denne?
f.eks.
public interface A {
public static void boo() { ... }
}

public class B implements A {
public static void boo() {
// En implementation
}
}

public class C implements A {
public static void boo() {
// En anden implementation
}
}


Hvis jeg kalder A.boo() som en statisk metode, hvilken implementation skal
så kaldes?

Stig


"Michael Berg" <michael.berg@bergconsult.kom> wrote in message
news:3e78c1f1$0$20455$edfadb0f@dread11.news.tele.dk...
Hej,

> >>public class B implements A {
> >> public static void boo() { ... }
> >>}
> >
> > Det her kan man ikke.
>
> Hov. Du har ret, beklager. Det kan man naturligvis ikke da man
> ikke kan tvinge implementerede metoder til at være identiske, hvorfor
> de i sagens natur ikke kan være statiske. Det må vel så også være
> grunden til at man ikke kan erklære statiske metoder i et
> interface.

Hvad mener du med at man ikke kan tvinge implementerede metoder til at være
ens og hvad har det med static at gøre? Ja undskyld men jeg forstod ikke en
bønne af det svar ..

Mvh Michael
www.key2know.dk



Michael Berg (20-03-2003)
Kommentar
Fra : Michael Berg


Dato : 20-03-03 20:16

Hej Stig!

> public interface A {
> public static void boo() { ... }
> }
>
> public class B implements A {
> public static void boo() {
> // En implementation
> }
> }
>
> public class C implements A {
> public static void boo() {
> // En anden implementation
> }
> }
>
>
> Hvis jeg kalder A.boo() som en statisk metode, hvilken implementation skal
> så kaldes?

Så vidt jeg kan visualisere det så vil du kalde en statisk metode ved navn boo() i klassen for det objekt, A henviser til - akkurat som ved ikke-statiske metoder.

Hvis A peger på et objekt af klassen MyClass så bliver det MyClass.boo() der bliver kaldt. Det ville vel virke på samme måde som ved almindelige metoder?

Mvh Michael


Stig Tanggaard (21-03-2003)
Kommentar
Fra : Stig Tanggaard


Dato : 21-03-03 17:07

Statiske metoder kan kaldes uden at have en instance af en klasse. Så når
jeg kalder A.boo() refererer A ikke til nogen implementation. Deri ligger
mit spørgsmål, hvordan skal A uden at have nogen reference til en
implementation vælge en implementation.

Jeg vil give dig ret i, at her
A a = new B();
a.boo();
er der en implementation

men her
A.boo()
vil der ikke være det.

Derfor mener jeg ikke det giver mening at have statiske metoder i
interfaces.

Stig

"Michael Berg" <michael.berg@bergconsult.kom> wrote in message
news:3e7a1363$0$20498$edfadb0f@dread11.news.tele.dk...
Hej Stig!

> public interface A {
> public static void boo() { ... }
> }
>
> public class B implements A {
> public static void boo() {
> // En implementation
> }
> }
>
> public class C implements A {
> public static void boo() {
> // En anden implementation
> }
> }
>
>
> Hvis jeg kalder A.boo() som en statisk metode, hvilken implementation skal
> så kaldes?

Så vidt jeg kan visualisere det så vil du kalde en statisk metode ved navn
boo() i klassen for det objekt, A henviser til - akkurat som ved
ikke-statiske metoder.

Hvis A peger på et objekt af klassen MyClass så bliver det MyClass.boo() der
bliver kaldt. Det ville vel virke på samme måde som ved almindelige metoder?

Mvh Michael



Morten (19-03-2003)
Kommentar
Fra : Morten


Dato : 19-03-03 22:07


> Hvad mener du med at man ikke kan tvinge implementerede metoder til at være ens og hvad har det med static at gøre? Ja undskyld men jeg forstod ikke en bønne af det svar ..

Problemstillingen er en helt anden end jeg troede. Egentligt gik mit
argument på:

public interface i {
public static void boo();
}

public class a implements i {
public static void boo() { System.out.println("a"); }
}

Man kan ikke kalde i.boo(); da den ikke har en implementation i
interfacet. Men så kunne man forestille sig flg.:

i var = new a();
var.boo();

Dette kan ikke lade sig gøre, da statiske metoder i Java ikke er
virtuelle.

Anyway. Det viser sig at være en større diskussion der i sidste
ende er bestemt af definitioner i Java language spec'en:
- et interface kan kun indeholde abstrakte metoder
- en statisk metode kan ikke være abstrakt

Så svaret på dit spørgsmål er efterhånden udvandet til "fordi de der
designede Java ikke synes at var af den overbevisning".

Der er masser af diskussioner på
http://groups.google.com/groups?q=java+static+method+interface

Morten


Michael Berg (20-03-2003)
Kommentar
Fra : Michael Berg


Dato : 20-03-03 20:30

Hej Morten!

> Dette kan ikke lade sig gøre, da statiske metoder i Java ikke er
> virtuelle.

Nej det forstås, men dybest set har det vel ikke noget med et interface at gøre. En interface erklæring er en ren deklarativ process hvor man fortæller hvilke metoder en given klasse skal implementere, og man kan vel godt i denne sammenhæng tage statiske metoder ind under den definition. Så jeg kan sige "dette interface fortæller mig at klassen har to almindelige metoder med disse parametre, samt en statisk metode med disse parametre).

> Anyway. Det viser sig at være en større diskussion der i sidste
> ende er bestemt af definitioner i Java language spec'en:
> - et interface kan kun indeholde abstrakte metoder
> - en statisk metode kan ikke være abstrakt

Ja. Ok. Heraf følger jo at interfaces ikke kan indeholde statiske metoder. Men årsagen er så kun at "man har bestemt" at sådan skal det være? Sikke noget slendrian ..

Det er jo ikke nogen kæmpe svaghed i sproget, det var nærmest tilfældigt at jeg faldt i en situation hvor jeg godt kunne have brugt det. Mit spørgsmål var sådan set mest af nysgerrighed, for jeg har for længst løst mit problem ved at bruge ikke-statiske metoder.

Men tak alligevel - det var oplysende

Mvh Michael


Anders K. Olsen (20-03-2003)
Kommentar
Fra : Anders K. Olsen


Dato : 20-03-03 22:31

"Michael Berg" <michael.berg@bergconsult.kom> skrev i en meddelelse
news:3e7a16ba$0$20441$edfadb0f@dread11.news.tele.dk...
>Nej det forstås, men dybest set har det vel ikke noget med et interface at
gøre. En interface erklæring er en ren deklarativ >process hvor man
fortæller hvilke metoder en given klasse skal implementere, og man kan vel
godt i denne sammenhæng tage >statiske metoder ind under den definition. Så
jeg kan sige "dette interface fortæller mig at klassen har to almindelige
metoder >med disse parametre, samt en statisk metode med disse parametre).

Det kan godt være, at det er mig der ikke har fuldt ordentligt med i tråden,
men jeg kan ikke rigtig se hvad du vil bruge en Statisk metode på et
interface til.

Er det fordi du vil tvinge en subklasse til at have en specifik metode?

Lad os se på flg. kode:

class SuperClass {
public void instanceMethod() {
System.out.println("Instance Super");
}
public static void staticMethod() {
System.out.println("Static Super");
}
}

class SubClass extends SuperClass {
public void instanceMethod() {
System.out.println("Instance Sub");
}
public static void staticMethod() {
System.out.println("Static Sub");
}
}

public class Test {
public static void main(String[] args) {
SuperClass a = new SuperClass();
SuperClass b = new SubClass();

a.instanceMethod();
b.instanceMethod();

a.staticMethod();
b.staticMethod();

SuperClass.staticMethod();
SubClass.staticMethod();
}
}

Hvis du kører Test, så vil du få flg. udskrift:

Instance Super
Instance Sub
Static Super
Static Super
Static Super
Static Sub

Som du kan se, udføres kald af statiske metoder på den klasse som variablen
er erklæret som og ikke den klasse som den rent faktisk er en instans af.
Dvs. selv om variable a og b faktisk er instanser af forskellige
(sub)klasser, er det den samme metode der kaldes, nemlig superklassens.

Så hvis du definerede en statisk metode på et interface og du har en
variable erklæret som værene en instans af dette interface, vil den statiske
metode på interfacet blive udført og ikke den aktuelle subklasses statiske
metode. Hvis man skal kunne definere statiske metoder på et interface, skal
man altså også kunne implementere dem i interfacet.

/Anders



Morten (21-03-2003)
Kommentar
Fra : Morten


Dato : 21-03-03 11:07

> Men tak alligevel - det var oplysende

Selv tak, ikke mindst for mig :)

Du har fuldstændig ret i at det er noget "slendrian". Jeg er selv
blevet af den overbevisning (efter at have læst diskussioner i
comp.lang.java.programmer), at der er mange gode argumenter for
at erklære (eller måske endda også implementere) statiske metoder i
interfaces.

Mvh Morten

Roar Gjøsæter (26-03-2003)
Kommentar
Fra : Roar Gjøsæter


Dato : 26-03-03 11:11



Michael Berg wrote:
>

<klipp klipp>

>
> Ja. Ok. Heraf følger jo at interfaces ikke kan indeholde statiske metoder. Men årsagen er så kun at "man har bestemt" at sådan skal det være? Sikke noget slendrian ..
>
> Det er jo ikke nogen kæmpe svaghed i sproget, det var nærmest tilfældigt at jeg faldt i en situation hvor jeg godt kunne have brugt det. Mit spørgsmål var sådan set mest af nysgerrighed, for jeg har for længst løst mit problem ved at bruge ikke-statiske metoder.
>
> Men tak alligevel - det var oplysende
>
> Mvh Michael

Heisann, håper det er ok for en normann å komme et par innspill.

Eg kom opp i samme situasjon (ønsket om static metoder i interface) i
min pågående hovedfagsoppgave (til graden cand scient), og tenkte å dele
det 'hack' eg har brukt for å løse dette problemet. Ikke vakkert, men
det fungerer på et vis.


public interface A{
//some methods

public static class Statics{
protected static String dummy = "dummy";

public static String calculateFooValue(long a, long b){
return a + "*" + b + " = " + (a*b) + dummy;
}

//more static methods
}
}

public class B implements A{
//some content
}


Det er nå muligt å skrive
B.Statics.calculateFoovalue( 3, 5 );



En av grunnene til å ønske static metoder (og variabler for den del) i
interface må dette være for å kunne dele metodeimplemeteringer mellom de
klasser som implementerer interfacet. Slike metoder må være av en slik
art at de ikke jobber på objectdata (på samme måte som andre statiske
metoder), og det vil derfor ofte være det som kan kales for støtte
metoder.


Det å definere
public interface A{
public static String calculateFooValue(long a, long b);
}
og så

public class B implements A{
public static String calculateFooValue(long a, long b){
return a + "*" + b + " = " + (a*b);
}
}

gir (som sagt mange andre steder i denne diskusjonen) ingen/liten
mening.





Min bruk oppstod i forbindelse med object fabrikker med plugin baserte
'factorycontexts' og et slags singleton pattern opp alt dette. Løsningen
kan kalles aksepttabel, men ikke god.


RAGgen
--
(...)det er en skam for en mann å ha langt hår.
1. Kor. 11:14

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste