2014-11-11 4 views
2

나는 JavaMail을 사용하여 전자 메일을 보내는 Javafx 응용 프로그램을 작성 중입니다. 새 세션을 만들 때 구문을 사용합니다. 람다 식을 단순화하는 데 사용할 수있는 경우세션에서 람다 식 사용

  Session session = Session.getInstance(props, 
      //Use labmda expression? 
      new javax.mail.Authenticator() { 

       protected javax.mail.PasswordAuthentication getPasswordAuthentication(){ 
       return new javax.mail.PasswordAuthentication(userName, password); 

       } 
      } 
     ); 

궁금해서 그와 같은

() -> return new java.mail.PasswordAuthentiaction(userName, password) 

하지만 난 그게 호환되지 않는 유형을 발생하고, 인증 자 기능 인터페이스 아니라고 말한다 사용할 때마다.

+2

인증 프로그램을 마무리하고 메소드를 제외한 메소드의 기본 구현을 구현해야 할 수도 있습니다. 그런 다음 당신은 당신의 목적을 위해 사용할 수있는 기능적인 인터페이스를 갖게 될 것입니다. –

+2

"* 사용할 때마다 호환되지 않는 타입을 던지고 Authenticator는 기능적 인터페이스가 아닙니다 *"라고 말합니다. "Authenticator"가 [기능 인터페이스] (https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#approach6) (참고 : 추상 메소드가 하나 뿐인 추상 클래스는 기능적 * 인터페이스 *로 간주되지 않습니다.) 그렇다면 아닙니다. 그 방법을 구현하기 위해 람다 (lambda)를 사용하십시오. – Pshemo

+0

구문이 올바르지 않다고 생각합니다. return 문 주위에 대괄호가 필요합니다. – tier1

답변

3

아니요, 여기에서 람다를 사용할 수 없습니다. 람다 만 기능 인터페이스 (하나의 추상 메소드와 인터페이스)하지만 Authenticator의 구현의 표현으로 사용할 수있는 것은

  1. 그것이 실제로 아무튼 (람다 구현해야 정확히 하나 개의 추상적 인 방법이 없기 때문에 기능적인 인터페이스 아니다 '이 t은 추상 클래스 (하지만, 여전히 클래스)하지 인터페이스입니다)
  2. 어떤 추상적 인 방법이있다.

이렇게 다시 한번 lambda는 하나의 추상 메소드가있는 인터페이스에서만 사용할 수 있습니다. 이 방법은 lambda가 구현하는 메소드를 알고 있습니다 (필요한 인수의 수, 유형 및 유형 또는 기대되는 반환 값이있는 경우 해당 서명을 알고 있기 때문에).
또한 SAM 인터페이스 (기능 인터페이스)에서만 사용할 수 있기 때문에 lambdas를 SAM (단일 추상 메서드 - 추상 클래스) 유형과 함께 사용할 수 있다고 말하지 않습니다.

3

여기서 람다를 사용할 수없는 이유에 대한 설명 외에도, 아마도 don't even need to use an Authenticator입니다.

+0

흥미 롭습니다 만,'Transport.send (message, username, password) '시그니처는 어디에 있습니까? –

+0

[JavaMail javadocs] (https://javamail.java.net/nonav/docs/api/javax/mail/Transport.html#sendMessage-javax.mail.Message-javax.mail.Address:A-)에서 당연하지. 이것이 API 문서를 찾는 첫 번째 장소가 아닌가요? –

+0

Gotcha! 이 주제에 대한 JavaMail 부분을 놓치 셨습니다. 나는 일반적인 J2E 전송을 찾고 있었다. –