Java Map құрастырғыш қателігі

// I know that this method will generated duplicate 
// trim keys for the same value but I am just
// trying to understand why we have a compile error:
// The method put(String, capture#11-of ?) in the type
// Map

map.get (key) дегенді қоюға болатын мән қандай бола алады?

3

12 жауаптар

Мәселе мынада, компилятор кілт түрін тек «белгісіз» деп біледі, бірақ Картаның кілтінің түрі үшін бірдей белгісіз түрін және get ( ) (тіпті біз де солай екенін түсінеміз).

Егер сіз оны жұмыс істегіңіз келсе, компиляторға сіздің әдісіңізді ұқсас белгісіз типті түрінде айтуыңыз керек, мысалы:

void  trimKeyMap(Map map) {
    for (String key : map.keySet()) {
        map.put(StringUtils.trim(key), map.get(key));
    }
}
10
қосылды
Толық шектелмеген V сөзін теру жеткілікті екенін ескеріңіз. Бұл тек «белгісіздер» деген екі «белгісіз» белгіге ие болу.
қосылды автор Thilo, көзі

It might have been possible for the Java 5 expert group, to add a little more power to the specification of wildcards in generic method argument types. I suspect the enhancement didn't make it due to lack of time in the specs phase. See my own recent question here: How does the JLS specify that wildcards cannot be formally used within methods?

Жақсы шешімнің жетіспеушілігі болмаса, әдісіңізді жалпы әдіс етіңіз.

 void trimKeyMap(Map map){
  for (String key : map.keySet()) {
    map.put(StringUtils.trim(key), map.get(key));
  }
}

You cannot put anything in a Map type, except for the null literal:

Map();
map.put("A", null);//Works
map.put("B", "X");//Doesn't work.

Компилятор білмейді , бұл картаның мән аргументінің түрі String . Сондықтан картадан өз мәнін алған болсаңыз да, картаға ештеңе қосуға мүмкіндік бермейді.

3
қосылды

It might have been possible for the Java 5 expert group, to add a little more power to the specification of wildcards in generic method argument types. I suspect the enhancement didn't make it due to lack of time in the specs phase. See my own recent question here: How does the JLS specify that wildcards cannot be formally used within methods?

Жақсы шешімнің жетіспеушілігі болмаса, әдісіңізді жалпы әдіс етіңіз.

 void trimKeyMap(Map map){
  for (String key : map.keySet()) {
    map.put(StringUtils.trim(key), map.get(key));
  }
}

You cannot put anything in a Map type, except for the null literal:

Map();
map.put("A", null);//Works
map.put("B", "X");//Doesn't work.

Компилятор білмейді , бұл картаның мән аргументінің түрі String . Сондықтан картадан өз мәнін алған болсаңыз да, картаға ештеңе қосуға мүмкіндік бермейді.

3
қосылды

It might have been possible for the Java 5 expert group, to add a little more power to the specification of wildcards in generic method argument types. I suspect the enhancement didn't make it due to lack of time in the specs phase. See my own recent question here: How does the JLS specify that wildcards cannot be formally used within methods?

Жақсы шешімнің жетіспеушілігі болмаса, әдісіңізді жалпы әдіс етіңіз.

 void trimKeyMap(Map map){
  for (String key : map.keySet()) {
    map.put(StringUtils.trim(key), map.get(key));
  }
}

You cannot put anything in a Map type, except for the null literal:

Map();
map.put("A", null);//Works
map.put("B", "X");//Doesn't work.

Компилятор білмейді , бұл картаның мән аргументінің түрі String . Сондықтан картадан өз мәнін алған болсаңыз да, картаға ештеңе қосуға мүмкіндік бермейді.

3
қосылды

Таза әдіс қолтаңбасын сақтағыңыз келсе (trimKeyMap клиенті жалпы әдісті пайдаланудың қажеті болмаса) көмекші әдісінде түрін шығаруды пайдалана аласыз:

void trimKeyMap(final Map void trim(final Map map, final String key) {
    map.put(StringUtils.trim(key), map.get(key));
}

This is called wildcard capture and is discussed more here: http://www.ibm.com/developerworks/library/j-jtp04298/

2
қосылды
Бұл шын мәнінде ұялатады, бірақ javac бұл интуитивті жағдайды өңдеу үшін «көрінбейтін жергілікті жалпы типтері» шығара алмайды «қойылмалы таңбаны басып шығару»
қосылды автор Lukas Eder, көзі

? is not a wildcard for any type but the unknown type. So the map only accepts ?-type objects and not String. One conclusion from this (rather strange) fact: We can't add values to collections that are parametized with ?.

1
қосылды

? is different from Object.

A Map is a generic map where you don't know the element type, but it is still being enforced, i.e. it does not allow you to put anything.

1
қосылды

? is different from Object.

A Map is a generic map where you don't know the element type, but it is still being enforced, i.e. it does not allow you to put anything.

1
қосылды

? is different from Object.

A Map is a generic map where you don't know the element type, but it is still being enforced, i.e. it does not allow you to put anything.

1
қосылды

Топтама және Maps параметріне қойылмалы таңбамен мәндеріне мәндерді ( null емес) ? . Өйткені қойылмалы таңба кез келген нысан үшін алмастырғыш емес, бұл белгісіз нысаны. Сондықтан белгісіз қабылдайтын картада белгілі бір нысанды қосуға болмайды (оны дәл осылай қояды).

Мәндерді ғана оқуға болады.

0
қосылды
Шамасы, сіз null қоссаңыз болады, бірақ бұл басқа жауап дұрыс.
қосылды автор Thilo, көзі
Маған дұрыс емес екенін дәлелдеңіз
қосылды автор darijan, көзі
Әрине, бірақ нөлден тыс объектілерге сілтеме жасайтынмын. Мен айқынырақ болуға тура келді.
қосылды автор darijan, көзі
Мен есімде бірнеше рет <?,?> Декларациясын қолданғанымды есіме түсірдім, бірақ осы уақыт аралығында білемін, мен бұл айнымалыларды әрдайым оқимын ...
қосылды автор Balint Bako, көзі
Сізге дұрыс емес екенін дәлелдеуге тырыстық, бірақ сәтсіз болды, сондықтан мен сізбен келісемін.
қосылды автор Balint Bako, көзі

Топтама және Maps параметріне қойылмалы таңбамен мәндеріне мәндерді ( null емес) ? . Өйткені қойылмалы таңба кез келген нысан үшін алмастырғыш емес, бұл белгісіз нысаны. Сондықтан белгісіз қабылдайтын картада белгілі бір нысанды қосуға болмайды (оны дәл осылай қояды).

Мәндерді ғана оқуға болады.

0
қосылды
Шамасы, сіз null қоссаңыз болады, бірақ бұл басқа жауап дұрыс.
қосылды автор Thilo, көзі
Маған дұрыс емес екенін дәлелдеңіз
қосылды автор darijan, көзі
Әрине, бірақ нөлден тыс объектілерге сілтеме жасайтынмын. Мен айқынырақ болуға тура келді.
қосылды автор darijan, көзі
Мен есімде бірнеше рет <?,?> Декларациясын қолданғанымды есіме түсірдім, бірақ осы уақыт аралығында білемін, мен бұл айнымалыларды әрдайым оқимын ...
қосылды автор Balint Bako, көзі
Сізге дұрыс емес екенін дәлелдеуге тырыстық, бірақ сәтсіз болды, сондықтан мен сізбен келісемін.
қосылды автор Balint Bako, көзі

Топтама және Maps параметріне қойылмалы таңбамен мәндеріне мәндерді ( null емес) ? . Өйткені қойылмалы таңба кез келген нысан үшін алмастырғыш емес, бұл белгісіз нысаны. Сондықтан белгісіз қабылдайтын картада белгілі бір нысанды қосуға болмайды (оны дәл осылай қояды).

Мәндерді ғана оқуға болады.

0
қосылды
Шамасы, сіз null қоссаңыз болады, бірақ бұл басқа жауап дұрыс.
қосылды автор Thilo, көзі
Маған дұрыс емес екенін дәлелдеңіз
қосылды автор darijan, көзі
Әрине, бірақ нөлден тыс объектілерге сілтеме жасайтынмын. Мен айқынырақ болуға тура келді.
қосылды автор darijan, көзі
Мен есімде бірнеше рет <?,?> Декларациясын қолданғанымды есіме түсірдім, бірақ осы уақыт аралығында білемін, мен бұл айнымалыларды әрдайым оқимын ...
қосылды автор Balint Bako, көзі
Сізге дұрыс емес екенін дәлелдеуге тырыстық, бірақ сәтсіз болды, сондықтан мен сізбен келісемін.
қосылды автор Balint Bako, көзі