호환되지 않는 유형 : int는 부울로 변환 할 수 없습니다
C가 왜 그것을 허용하고 Java를 허용하지 않는지에 관심이 있습니다. 따라서 언어의 유형 시스템, 특히 언어 유형에 관심이 있습니다.
질문에는 두 부분이 있습니다.
왜 자바 변환하지 않습니다 int
에 boolean
?
이것은 가능한 한 명시 적으로 의도 된 Java로 요약됩니다. 타입 시스템으로 "얼굴에"매우 정적입니다. 다른 언어로 자동으로 타입 캐스트되는 것은 Java에서는 그렇지 않습니다. 당신도 작성 int a=(int)0.5
해야합니다. 로 변환 float
하면 int
정보가 손실됩니다. 로 변환 int
하는 것과 동일 boolean
하므로 오류가 발생하기 쉽습니다. 또한 많은 조합을 지정해야했습니다. 물론, 이러한 것들은 명백해 보이지만주의를 기울이려는 의도가있었습니다.
아, 다른 언어와 비교할 때 바이트 코드는 내부 구현 세부 사항이 아니기 때문에 Java는 사양 이 매우 정확했습니다. 그들은 모든 상호 작용을 정확하게 지정해야 할 것입니다. 거대한 사업.
왜 if
다른 유형을 허용 하지 boolean
않습니까?
if
이외의 다른 유형을 허용하는 것으로 완벽하게 정의 할 수 있습니다 boolean
. 다음과 같다는 정의가있을 수 있습니다.
true
int != 0
String
와 .length>0
- 값 이 아닌
null
( 가 아닌) 다른 객체 참조 .Boolean
false
- 또는 심지어 : 비 객체
null
이며 Object.check_if
(이 경우 나 만 발명 한) 메소드 가 반환 하는 다른 객체 참조 true
.
그들은하지 않았다; 실제로 필요하지 않았으며 가능한 강력하고 정적이며 투명하고 읽기 쉬운 등을 원했습니다. 암시 적 기능이 없습니다. 또한 구현은 매우 복잡 할 것입니다. 가능한 모든 경우에 대해 각 값을 테스트해야하므로 성능은 작은 요소를 연주했을 수도 있습니다 (Java는 그 당시 컴퓨터에서 sloooow였습니다. 적어도 첫 번째 릴리스의 JIT 컴파일러는 없었습니다. 적어도 그때 사용한 컴퓨터에는 없었습니다).
더 깊은 이유
더 깊은 이유는 Java가 기본 유형을 가지고 있기 때문에 유형 시스템이 객체와 기본 유형 사이에서 찢어진다는 사실 일 수 있습니다. 아마도 그들이 피했다면 다른 방법으로 밝혀 졌을 것입니다. 이전 섹션에 주어진 규칙을 사용하면 모든 기본 요소 의 진실성을 명시 적으로 정의해야합니다 (기본 요소는 수퍼 클래스를 공유하지 않으며 null
기본 요소에 대해 잘 정의 되어 있지 않기 때문에 ). 이것은 빠르게 악몽으로 변할 것입니다.
시야
글쎄, 결국 언어 디자이너가 선호하는 것일 수도 있습니다. 각 언어는 거기에서 자신의 길을 돌리는 것처럼 보입니다 ...
예를 들어, Ruby에는 기본 유형이 없습니다. 문자 그대로 모든 것이 대상입니다. 그들은 모든 객체가 특정 방법을 가지고 있는지 확인하는 매우 쉬운 시간을 가지고 있습니다.
루비는 당신이 던질 수있는 모든 종류의 물건에 진실성을 찾습니다. 흥미롭게도, 그것은 여전히이없는 boolean
(가 더 프리미티브가 없기 때문에) 타입을, 그리고 는 더이 없습니다 Boolean
중 클래스를. 값에 어떤 클래스가 있는지 물어 보면 true
(손으로 사용할 수 있음 true.class
) 얻을 수 TrueClass
있습니다. 이 클래스에는 실제로 메서드가 있습니다. 즉 부울 ( | & ^ ==
)에 대한 4 연산자입니다 . 여기서, if
그 중 하나의 경우에만, 그 값을 고려 falsey false
또는 nil
합니다 ( null
루비). 그 밖의 모든 것이 사실입니다. 그래서, 0
또는 ""
둘 다 사실입니다.
Object#truthy?
모든 클래스에 구현할 수 있는 방법을 만들어 개인의 진실성을 돌려주는 것은 사소한 일이었습니다. 예를 들어, String#truthy?
비어 있지 않은 문자열에 대해서는 true로 구현되었을 수 있습니다. 비록 루비가 대부분의 부서에서 Java의 반 체가되었지만 (믹스 인, 재 개방 클래스 등을 사용한 동적 오리 타이핑) 그렇지 않았습니다.
$value <> 0 || length($value)>0 || defined($value)
진실에 익숙한 Perl 프로그래머에게는 놀라운 일입니다. 등등.
null
어떤 식 으로든 어떤 식 으로든 자동으로 거짓이 된다는 규칙을 사용하여 SQL을 입력하십시오 . 그래서 (null==null) = false
. 루비에서 (nil==nil) = true
. 행복한 시간.