Сделать & ldquo; тип-безопасный & rdquo; и & ldquo; строго типизированный & rdquo; значит то же самое?

У меня была одна и та же проблема, но для меня это не помогло, но это помогло мне как с JPA, так и с MongoDb, чтобы сохранить кого-то еще, потратив на это время. Мало того, что это работает с валидацией, но я получаю приятную ошибку 400, а не по умолчанию 500.

Пришлось добавить это в мои зависимости build.gradle

    compile('org.hibernate:hibernate-validator:4.2.0.Final')

и это config class

@Configuration
public class CustomRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter {


   @Bean
   public Validator validator() {
       return new LocalValidatorFactoryBean();
   }

   @Override
   public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
       validatingListener.addValidator("afterCreate", validator());
       validatingListener.addValidator("beforeCreate", validator());
       validatingListener.addValidator("afterSave", validator());
       validatingListener.addValidator("beforeSave", validator());
   }
}
29
задан Matt J 9 June 2009 в 09:59
поделиться

4 ответа

Нет, не обязательно - хотя это зависит от вашего определения терминов, и нет очень четких и широко принятых определений.

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

Например, в C # 4.0 вы можете:

dynamic foo = "hello";
dynamic length = foo.Length; // Uses String.Length at execution time
foo = new int[] { 10, 20, 30 };
length = foo.Length; // Uses Array.Length at execution time
dynamic bar = (FileStream) foo; // Fails!

Последняя строка является ключом к безопасности типов: нет безопасного преобразования из массива int в FileStream , поэтому операция завершается неудачно - вместо обработка байтов объекта массива так, как если бы они были FileStream .

РЕДАКТИРОВАТЬ: C # обычно является "строго типизированным" (как язык) и безопасным типом: компилятор не позволит вам выполнять произвольные вызовы объекта, а среда выполнения не позволит вам выполнять несоответствующие преобразования.

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

Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.

Обратите внимание, что foreach выполняет неявное преобразование, что делает его своего рода гибрид:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

Это будет компилироваться (недавно был еще один вопрос ), но завершится ошибкой во время выполнения. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.

t позволяет вам делать произвольные вызовы объекта, и среда выполнения не позволит вам выполнять несоответствующие преобразования.

Я не совсем уверен, где подходит небезопасный код - я не знаю достаточно об этом, чтобы комментировать, Боюсь.

Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.

Обратите внимание, что foreach выполняет неявное преобразование, что делает его своего рода гибридом. :

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

Это будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.

t позволяет вам делать произвольные вызовы объекта, и среда выполнения не позволит вам выполнять несоответствующие преобразования.

Я не совсем уверен, где подходит небезопасный код - я не знаю достаточно об этом, чтобы комментировать, Боюсь.

Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.

Обратите внимание, что foreach выполняет неявное преобразование, что делает его своего рода гибридом. :

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

Это будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.

m не совсем уверен, где подходит небезопасный код - боюсь, я недостаточно знаю об этом, чтобы комментировать.

Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.

Обратите внимание, что foreach выполняет неявное преобразование, что делает его своего рода гибридом:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

Он будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.

m не совсем уверен, где подходит небезопасный код - боюсь, я недостаточно знаю об этом, чтобы комментировать.

Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.

Обратите внимание, что foreach выполняет неявное преобразование, что делает его своего рода гибридом:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

Он будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.

Обратите внимание, что foreach выполняет неявное преобразование, что делает его своего рода гибридом:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

Он будет компилироваться (недавно был еще один вопрос по этому поводу), но не выполнится. время. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.

Обратите внимание, что foreach выполняет неявное преобразование, что делает его своего рода гибридом:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

Он будет компилироваться (недавно был еще один вопрос по этому поводу), но не выполнится. время. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.

25
ответ дан 28 November 2019 в 02:01
поделиться

Хороший вопрос. Прочтите эту запись в Википедии, вот выдержка:

Бенджамин С. Пирс, автор книги «Типы» и языки программирования и Advanced Типы и языки программирования, говорит: "Я потратил несколько недель ... пытаясь отсортировать вне терминологии "сильно типизированный, "" статически типизированный "," безопасный " и т. д., и нашел это удивительно сложно .... Использование этих терминов настолько разнообразен, что делает их почти бесполезно. "

4
ответ дан 28 November 2019 в 02:01
поделиться

«Тип безопасен» означает, что здесь не задействовано приведение типов и не могут возникнуть ошибки типа времени выполнения.

Некоторые люди утверждают, что «строго типизированный»

1
ответ дан 28 November 2019 в 02:01
поделиться

Они в основном одинаковы, это просто вопрос интерпретации:

Из википедии:

Типовая безопасность :

Типовая безопасность является синонимом одного из многих определения строгой типизации; но безопасность типов и динамическая типизация взаимно совместимы. Язык с динамической типизацией, такой как Smalltalk, можно рассматривать как строго типизированный язык с очень разрешающей системой типов, где любая синтаксически правильная программа хорошо типизирована; до тех пор, пока его динамическая семантика гарантирует, что ни одна такая программа никогда не «пойдет не так» в надлежащем смысле, она удовлетворяет приведенному выше определению и может быть названа типобезопасной.

0
ответ дан 28 November 2019 в 02:01
поделиться
Другие вопросы по тегам:

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