AMcoder - javascript, python, java, html, php, sql

Օբյեկտի փոխանցում ինտերֆեյսի վրա, որն իրագործված չէ

Ես գտա հետևյալ հարցը իմ ուսումնական գրքում և մի փոքր շփոթված.

Հաշվի առնելով հետևյալ կոդը, ո՞ր տարբերակը, եթե օգտագործվի /* INSERT CODE HERE */-ին փոխարինելու համար, հնարավորություն կտա Roamable տիպի հղման փոփոխականին հղում կատարել Phone դասի օբյեկտին: (Ընտրեք 1 տարբերակ:)

interface Roamable{}
class Phone {}
class Tablet extends Phone implements Roamable {
    //INSERT CODE HERE
}

Ընտրանքներն են.

  1. Roamable var = new Phone();
  2. Roamable var = (Roamable)Phone();
  3. Roamable var = (Roamable)new Phone();
  4. Քանի որ Roamable ինտերֆեյսը և Phone դասը կապ չունեն, Roamable տիպի հղման փոփոխականը չի կարող վերաբերել Phone դասի օբյեկտին:

Ես կարծում էի, որ ճիշտ տարբերակը 4-ն է, բայց ասում է, որ 3-ն է:

Բայց, Phone-ը չի իրականացնում Roamable ինտերֆեյսը, այնպես որ դուք չեք կարող հեռարձակել, չէ՞:

16.02.2014

  • Դե, փորձե՞լ եք սա: Ի՞նչ պարզեցիք թեստավորումից հետո: 16.02.2014
  • Ճիշտ. Փորձեք և տեսեք, թե ինչ է տեղի ունենում: 16.02.2014

Պատասխանները:


1

Ճիշտ պատասխանն է 3. Կազմողը տեսնում է միայն, որ Phone-ը փոխանցվում է Roamable-ին, և որ Phone-ը վերջնական չէ, ուստի կարծում է, որ նետվող օբյեկտը, թեև նշված է որպես Phone, կարող է լինել Phone-ի ենթադաս, որը անում էիրականացնում Roamable-ը, ուստի կոմպիլյացիայի ժամանակի սխալ կամ նախազգուշացում չի տրվում:

Համաձայն JLS 5-րդ գլխի

5.5.1. Հղման տեսակը Ձուլում

Հաշվի առնելով S-ի (աղբյուր) տեղեկատուի տիպը (աղբյուր) և կոմպիլյացիայի ժամանակի հղման տեսակը (թիրախ), գոյություն ունի ձուլման փոխակերպում S-ից T-ի, եթե կոմպիլյացիայի ժամանակի սխալներ տեղի չեն ունենում հետևյալ կանոնների պատճառով: Եթե ​​T-ն ինտերֆեյսի տեսակ է.

Եթե ​​S-ը վերջնական դաս չէ (§8.1.1), ապա, եթե կա T-ի X սուպերտիպ և S-ի Y սուպերտիպ, այնպես որ և՛ X-ը, և՛ Y-ն ապացուցելիորեն տարբեր պարամետրացված տիպեր են, և որ X-ի ջնջումները: և Y-ը նույնն են, տեղի է ունենում կոմպիլյացիայի ժամանակի սխալ:

Հակառակ դեպքում, դերասանական կազմը միշտ օրինական է կոմպիլյացիայի ժամանակ (քանի որ նույնիսկ եթե S-ը չի իրականացնում T-ը, S-ի ենթադասը կարող է):

Եթե ​​S-ը վերջնական դաս է (§8.1.1), ապա S-ը պետք է իրականացնի T, հակառակ դեպքում տեղի է ունենում կոմպիլյացիայի ժամանակի սխալ:


Հետևյալ կոդը կազմվում է.

interface Roamable{}
class Phone {}
class Tablet extends Phone implements Roamable {
    Roamable var = (Roamable)new Phone(); // Compiles
}
16.02.2014
  • Կոդը կազմվում է, բայց հարցը which option will enable a reference variable of type Roamable to refer to an object of the Phone class է: Փոփոխականը կարող է վերաբերել միայն գործարկման ժամանակ, և դա չի աշխատի, քանի որ կառաջացնի ClassCastException: 16.02.2014
  • @Reboot Ես (և խնդրի հեղինակը, թվում է,) դա նշանակում է կազմելու պահին: Դուք միանգամայն իրավացի եք, թեև այն կպայթի, եթե վազեք: 16.02.2014
  • Սա ուսումնական գրքի հարց է, և եթե գրքում իսկապես այդպես է գրված, ապա գրքում տրված պատասխանը սխալ է, իսկ ճիշտ պատասխանը 4-ն է: հարցը վատ է գրված. Երկու դեպքում էլ գիրքը սխալ է։ 16.02.2014
  • Այո, ես կհամաձայնեի, որ եթե վերը նշվածը քիչ թե շատ ճշգրիտ պատկերացում է բուն հարցի, լավագույն դեպքում թերի է: 17.02.2014

  • 2

    Պատասխանը կլինի 4

    as

    1 is incorrect(explanation --> 4)
    2 is incorrect syntax
    3 is incorrect typecast.
    

    Նկատի ունեցեք, որ պատասխան 3 վավերական է, քանի դեռ խոսքը վերաբերում է կազմելու մասին: Երբ ասում եք, որ ունեք Phone դասի օրինակ, կարող եք մուտքագրել cast-ը Tablet-ի մեջ (Ինչպես կարող եք գցել Object-ից String): Եվ քանի որ Tablet-ն իրականացնում է Roamable-ը, դուք կարող եք շատ լավ օգտագործել Roamable հղումը՝ այն հղում կատարելու համար: Problem will occur at runtime-ը, քանի որ Object-ն իսկապես Phone տեսակի է:

    Սա միայն կապի ձևերից մեկն է (ներկայիս համատեքստում), որը թույլ է տալիս հաջող հավաքել: Բայց ինչպես Բոհեմն է նշել իր պատասխանում ընդհանրապես

    Եթե ​​մենք մուտքագրում ենք կոմպիլյացիոն ժամանակի տեղեկանք S(ոչ վերջնական) կազմելու ժամանակի հղումը T, ապա կոմպիլյացիան հաջող կլինի որպես even if S does not implement T, a subclass of S might: Եթե ​​S-ը վերջնական դաս է, ապա S-ն պետք է իրականացնի T, հակառակ դեպքում տեղի է ունենում կոմպիլյացիայի ժամանակի սխալ:

    Իրականում Tablet դասարանի Phone դասը երկարացնելու կարիք ընդհանրապես չկա: Քանի դեռ Հեռախոսային դասը not final է, հավաքումը հաջող կլինի

    interface Roamable{}
    class Phone {}
    class Tablet implements Roamable {
        Roamable var = (Roamable)new Phone(); // Compiles
    }
    
    16.02.2014
  • Որպեսզի իմանաք, ձեր բացատրությունը լիովին սխալ է, և ձեր օրինակը անտեղի: 16.02.2014
  • Դուք հավանաբար պետք է ծանոթանաք նաև գրագողության սահմանմանը :) 16.02.2014
  • :) Ասում է without crediting the original author: Բայց ես իմ պատասխանի մեջ նշեցի քեզ ու մեկնաբանությունում էլ շնորհակալություն հայտնեցի։ 16.02.2014
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..