2008-09-19 3 views
-2

Java에서 정적 유형과 동적 유형을 모두 허용하는 경우 어떻게됩니까? 그것은 두 세계의 장점을 허용 할 것입니다. 즉 : 정적 유형과 동적 유형을 모두 지원하도록 Java를 변경하는 것이 유용할까요?

String str = "Hello"; 
var temp = str; 
temp = 10; 
temp = temp * 5; 
  1. 은 가능할 것인가?
  2. 도움이 되겠습니까?
  3. 현재 두 언어를 지원하는 언어가 있습니까? 얼마나 잘 작동합니까? 여기

더 좋은 예입니다 (제네릭을 사용할 수 없습니다 수 있지만 프로그램은 유형을 알고 않습니다) :

var username = HttpServletRequest.getSession().getAttribute("username");//Returns a String 
if(username.length() == 0) { 
    //Error 
} 
+0

... * 모든 것을 * 깰 것입니다. – wchargin

답변

1

당신이 당신의 예와

String str = "Hello"; 
Object temp = str; 
temp = 10; 
+0

int는 객체 – Silas

+0

의 서브 클래스가 아니므로 실제로 컴파일되지 않습니다. 동적 인 것은 var의 메소드를 호출 할 수 있으며 런타임 유형에 메소드가 있으면 작동합니다. 그래서 당신의 경우, temp.length()를 호출하는 것은 캐스트 없이는 작동하지 않습니다. 동적은 런타임 형식 검사를 의미하며 컴파일 시간은 아닙니다. –

+0

나는 더 나은 결과를 보여준 더 나은 예제를 추가했습니다. –

0

사이의 차이를 설명 할 수 동적 유형 지정 변수의 유형은 유니버설이며 모든 다른 유형은 유니버설의 하위 유형입니다. 모든 유형이 이러한 범용 유형 (예 : Java 모듈로 unboxed 값)에서 상속하는 모든 언어는 이미이 기능을 가지고 있습니다. 유용성에 관해서 - 당신이하는 일에 달려 있습니다. 필자는 안전한 태그가 적용된 유니온을 쉽게 생성 할 수있는 완전 정적 유형 시스템을 선호하므로 필요한 값을 변수에 넣을 수 있지만 제어 방식은 유니버설보다 큽니다.

0

예, 유용 할 수 있지만 표시하려는 예는 아닙니다. 이 같은 일이

public void f(var o) 
{ 
    o.method(); 
} 

더 좋을 거라 생각하고 나는 인터페이스를 도입 할 필요없이)하는 방법이라는 방법으로 모든 객체 (와 f를 호출 할 수 있습니다. 국제 대회가 있지만 국제 대회가 필요한 장소에는 적합합니다. 또한 동적 디스패치가있는 언어와 interop에 유용합니다.

+0

나쁜 예가 유감스럽게 생각합니다. 더 좋은 예를 추가했습니다. –

2

C#은 "var"키워드를 사용하여 사용자가 설명하는 방식으로 사용되지만 형식 검사에서 제안 할 값의 유형에 따라 강력한 형식의 변수가됩니다.

0
  1. 가능합니까?
    거의 없습니다. 자바는 정적 인 타이핑 만 지원하도록 처음에 설계된 C와 유사한 언어입니다. 이 기능을 Java에 도입하는 데는 많은 시간이 필요하며 개발자가 그것에 시간을 할애 할 것이라고 생각하지 않습니다.
  2. 도움이 되겠습니까?
    아니요. Java는 전통적인 언어이며 정적 유형 지정은 기본 원칙 또는 아키텍처 중 하나입니다. 실제로 프로그래밍에서 정적 유형 지정이 더 많이 사용됩니다 (흥미있는 통계를 확인할 수 있습니다) here.
  3. 현재 어떤 언어가이를 지원합니까? 얼마나 잘 작동합니까?
    글쎄, 동적 타이핑을 지원하는 많은 언어가 있지만, 당신이 이것을 알고 있다고 생각합니다. 언어가 동적 타이핑을 지원하는 경우이 언어에 정적 타이핑을 도입하는 것은 의미가 없습니다 ...

또한 정적 유형 지정으로 구현할 수있는 기능을 구현할 수 있습니다. jon은 Java에서 "Object"클래스를 사용하여 예제를 제공했습니다. C/C++에서 void *와 비슷하게 할 수 있습니다. 그래도 언어가 동적으로 입력되지는 않습니다.

+0

# 2 : 한 방향으로 설계 되었기 때문에 다른 방향으로는 유용하지 않다는 의미는 아닙니다. 그 논리는 많은 최근의 변경을 막았을 것입니다. 제네릭, 각 열거 형 등등. # 3 : 나는 분명하지 않았습니다. 미안합니다. 둘 다 지원하는 언어입니다. –

0

@Lou : 그것은을 위해 단지 문법 설탕을 것 :

void doSth(Object foo) throws Exception{ 
     Method m = foo.getClass().getMethod("foo", String.class); 
     m.invoke(foo, "baz");  
} 

내가 사용하는 반사를 수행하지만 그것이 학대 아니에요, 그래서 그것은 추한 것을 선호합니다.

+0

그 논리는 위험한 모든 것이 남용을 피하기 힘들어 야한다고 말하기 위해 사용될 수 있습니다. 루프, 쓰레드 등등은 학대 당할 수 있으므로 그들이 또한 열심히해야한다고 생각합니까? –

+0

그럴 수도 있습니다 - 반사없이 구현할 수도 있습니다 - 요점은 일부 언어 (LISP, python, Ruby)가이 부분에 전적으로 빌드되어 있으며 사용자가 유용하다고 느낍니다. Java에서도 (일부 애플리케이션의 경우) –

+0

Java의 기능 중 하나는 기능이 부족하다는 것입니다. 자바는 스스로를 발로 차기가 더 어렵게 만듭니다. 그리고 나쁜 프로그래머가 발생하고 ... 나쁜 코드로 작업하는 경우가 발생합니다. 동적 유형을 사용하면 Java가 새로운 수준의 불량 코드에 도달합니다. –

0

동적 타이핑에는 확실히 용도가 있습니다.

그러나 Java에 이것을 추가하는 것이 합리적이라고 생각하지 않습니다. Java는 정적 유형 언어로 설계되었으며이 시점에서 동적 유형을 시도하고 접목하기에는 너무 큰 철학적 및 구조적 변화가 될 것입니다. 당신이 적절한 동적 입력을 원하지만 여전히 자바 생태계의 일부가 될 동적 입력을 지원하는 다른 위대한 JVM 언어 중 하나에서보고 싶으면

: 예를 들어, Clojure 과 Groovy.

0

동적 유형 지정 언어는 코딩을 다소 간단하고 빠르지 만 컴파일 시간 (찾기 쉬운)에서 런타임 (찾기 어렵고 예측할 수없는)까지 밀어 넣는 대신에 코딩을 수행합니다. 자바가 소개하고 널리 퍼지게된다면 코드 품질과 시간에 신경을 쓰는 다른 언어를 찾아 볼 것입니다.

필자는 Java 작업의 프론트 엔드로 많은 Flex 개발 작업을하고 있으며, 매개 변수가있는 Flex 메서드로 작업 할 때 개발자가 사용한 대부분의 시간 매개 변수 형식에 대한 개체, 그리고 난 전혀 모르겠어요 어떤 속성/메서드를 중단 점이있는 프로그램을 실행하지 않고 있고 메서드에 대한 모든 가능한 호출을 테스트하기를 바랐다. 그리고 매개 변수에 특정 클래스를 사용 했더라도 속성/메서드가 추가되거나 삭제되지 않았다는 말은 없습니다.

관련 문제