Почему делает java.util. Свойства реализуют Карту <Объект, Объект> и не Карту <Строка, Строка>

Вам также необходимо использовать компонент Provider где-то выше компонента MyContext.Consumer.

Пример

const initialState = {
  ve: "randomValue"
};
const MyContext = React.createContext();

class MyProvider extends React.Component {
  constructor(props) {
    super(props);
    this.state = initialState;
  }

  render() {
    return (
      <MyContext.Provider
        value={{
          state: this.state
        }}
      >
        {this.props.children}
      </MyContext.Provider>
    );
  }
}

class App extends React.Component {
  render() {
    return (
      <MyProvider>
        <MyContext.Consumer>
          {context => <div>{JSON.stringify(context)}</div>}
        </MyContext.Consumer>
      </MyProvider>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>

52
задан Mike Kucera 16 May 2009 в 12:17
поделиться

4 ответа

Потому что они делали это в спешке на заре Java и не понимали, какие последствия будут иметь четыре версии позже.

Дженерики должны были быть частью дизайна. Java с самого начала, но эта функция была исключена как слишком сложная и в то время ненужная. В результате большая часть кода в стандартных библиотеках написана с предположением неуниверсальных коллекций. Потребовался прототип языка «Pizza» от Мартина Одерски, чтобы показать, как они могут быть выполнены достаточно хорошо, сохраняя при этом почти идеальную обратную совместимость как с кодом Java, так и с байт-кодом. Прототип привел к Java 5, в которой классы коллекций были модернизированы с помощью дженериков таким образом, чтобы старый код продолжал работать.

К сожалению, если бы они задним числом заставили Свойства унаследовать от Map , то следующий ранее действующий код перестал бы работать:

Map<Object, Object> x = new Properties()
x.put("flag", true)

Почему кто-то будет это делать, я не понимаю, но стремление Sun к обратной совместимости в Java вышло за рамки героического и превратилось в бессмысленное.

Наиболее образованные наблюдатели оценили то, что Properties вообще никогда не должны были унаследовать от Map . Вместо этого он должен обернуть вокруг Map , показывая только те особенности Map, которые имеют смысл.

С тех пор, как заново изобрел Java, Мартин Одерски создал новый язык Scala, который является более чистым, наследует меньше ошибок, и открывает новые горизонты во многих областях. Если вас раздражают мелочи Java, взгляните на нее.

тогда следующий ранее действующий код перестал бы работать:

Map<Object, Object> x = new Properties()
x.put("flag", true)

Я не понимаю, почему кто-то будет это делать, но стремление Sun к обратной совместимости в Java вышло за рамки героического и превратилось в бессмысленное.

Сейчас наиболее образованные наблюдатели оценивают то, что Свойства никогда не должны были наследоваться от Карты . Вместо этого он должен обернуть вокруг Map , показывая только те особенности Map, которые имеют смысл.

С тех пор, как заново изобрел Java, Мартин Одерски создал новый язык Scala, который является более чистым, наследует меньше ошибок, и открывает новые горизонты во многих областях. Если вас раздражают мелочи Java, взгляните на нее.

тогда следующий ранее действующий код перестал бы работать:

Map<Object, Object> x = new Properties()
x.put("flag", true)

Я не понимаю, почему кто-то будет это делать, но стремление Sun к обратной совместимости в Java вышло за рамки героического и превратилось в бессмысленное.

Сейчас наиболее образованные наблюдатели оценивают то, что Свойства никогда не должны были наследоваться от Карты . Вместо этого он должен обернуть вокруг Map , показывая только те особенности Map, которые имеют смысл.

С тех пор, как заново изобрел Java, Мартин Одерски создал новый язык Scala, который является более чистым, наследует меньше ошибок, и открывает новые горизонты во многих областях. Если вас раздражают мелочи Java, взгляните на нее.

Приверженность Java к обратной совместимости перешла от героического к бессмысленному.

Наиболее образованные наблюдатели оценили то, что Properties никогда не должны были наследовать от Map . Вместо этого он должен обернуть вокруг Map , показывая только те особенности Map, которые имеют смысл.

С тех пор, как заново изобрел Java, Мартин Одерски создал новый язык Scala, который является более чистым, наследует меньше ошибок, и открывает новые горизонты во многих областях. Если вас раздражают мелочи Java, взгляните на нее.

Приверженность Java к обратной совместимости перешла от героического к бессмысленному.

Наиболее образованные наблюдатели оценили то, что Properties никогда не должны были наследовать от Map . Вместо этого он должен обернуть вокруг Map , показывая только те особенности Map, которые имеют смысл.

С тех пор, как заново изобрел Java, Мартин Одерски создал новый язык Scala, который является более чистым, наследует меньше ошибок, и открывает новые горизонты во многих областях. Если вас раздражают мелочи Java, взгляните на нее.

Вместо этого он должен обернуть вокруг Map , показывая только те особенности Map, которые имеют смысл.

С тех пор, как заново изобрел Java, Мартин Одерски создал новый язык Scala, который является более чистым, наследует меньше ошибок, и открывает новые горизонты во многих областях. Если вас раздражают мелочи Java, взгляните на нее.

Вместо этого он должен обернуть вокруг Map , показывая только те особенности Map, которые имеют смысл.

С тех пор, как заново изобрел Java, Мартин Одерски создал новый язык Scala, который является более чистым, наследует меньше ошибок, и открывает новые горизонты во многих областях. Если вас раздражают мелочи Java, взгляните на нее.

53
ответ дан 7 November 2019 в 09:20
поделиться

Первоначально предполагалось, что Свойства действительно будут расширять Hashtable . К сожалению, реализация мостовых методов вызвала проблему. Свойства , определенные таким образом, заставляют javac генерировать синтетические методы. Свойства должны определять, скажем, метод get , который возвращает String , но должен переопределить метод, возвращающий Object . Итак, добавлен метод синтетического моста.

Предположим, у вас есть класс, написанный в старые добрые 1,4 дня. Вы переопределили некоторые методы в Properties . Но то, что вы не сделали, - это переопределить новые методы. Это приводит к непреднамеренному поведению. Чтобы избежать этих методов моста, Свойства расширяет Hashtable . Аналогично Iterable не возвращает (только для чтения) SimpleIterable , потому что это добавило бы методы к реализациям Collection .

27
ответ дан 7 November 2019 в 09:20
поделиться

Обратная совместимость.

4
ответ дан 7 November 2019 в 09:20
поделиться

The reason: Liskov substitution principle and backwards compatibility. Properties extends Hashtable and thus must accept all messages that Hashtable would accept - and that means accepting put(Object, Object). And it has to extend plain Hashtable instead of Hashtable because Generics were implemented in the downwards-compatibe way via type erasure, so once the compiler has done its thing, there are no generics.

2
ответ дан 7 November 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: