2016-02-26 15 views
6

Tôi đang cố gắng tạo ra một hệ thống phân cấp của vài lớp, mỗi lớp sẽ ghi đè một số hành vi trong các lớp bên trong của nó là cha mẹ (Các trình vòng lặp cụ thể, nhưng nó không quan trọng). Về cơ bản, có vẻ như sau:Các lớp bên trong Thừa kế trong Kotlin

open class SuperClass<T>{ 
    protected open inner class InnerClass{ 
     fun someLogic(){ 
      println("some logic happened") 
     } 

     open fun someOverridableLogic(){ 
      println("some logic happened") 
     } 
    } 
} 

class ChildClass<T> : SuperClass<T>(){ 
    protected inner class ChildInnerClass:InnerClass{ 
     override fun someOverridableLogic(){ 
      super.someOverridableLogic() 
      println("some OTHER logic happened") 
     } 
    } 
} 

Trình biên dịch từ chối làm việc với mã này, tham số kiểu mong đợi trên InnerClass khi ChildInnerClass kế thừa từ đó. Tuy nhiên, sau khi thêm tham số như thế này:

protected inner class ChildInnerClass:InnerClass<T> 

biên dịch đột nhiên không không mong đợi bất kỳ thông số loại!

Java tương đương này biên soạn và thực hiện như mong đợi, không có tham số type:

public class SuperClass<T> { 
    protected class InnerClass{ 
     public void someLogic(){ 
      System.out.println("some logic happened"); 
     } 

     public void someOverridableLogic(){ 
      System.out.println("some logic happened"); 
     } 
    } 
} 


public class ChildClass<T> extends SuperClass<T>{ 
    protected class ChildInnerClass extends InnerClass{ 
     @Override 
     public void someOverridableLogic() { 
      super.someOverridableLogic(); 
      System.out.println("some OTHER logic happened"); 
     } 
    } 
} 

Vì vậy, tôi làm điều gì sai trong Kotlin, hoặc là nó chỉ đơn giản là một giới hạn ngôn ngữ tôi đã không nhận thức được về?

Trả lời

5

Trình biên dịch không mong đợi đối số loại trên InnerClass nhưng trên SuperClass trong SuperClass.InnerClass. Đây là vấn đề đã biết: Capture generics in inner classes : KT-9208.

Đối với bây giờ bạn có thể làm như sau:

open class SuperClass<T> { 
    protected open inner class InnerClass { 
     fun someLogic() { 
      println("some logic happened") 
     } 

     open fun someOverridableLogic() { 
      println("some logic happened") 
     } 
    } 
} 

class ChildClass<T> : SuperClass<T>() { 
    protected inner class ChildInnerClass : SuperClass<T>.InnerClass() { 
     override fun someOverridableLogic() { 
      super.someOverridableLogic() 
      println("some OTHER logic happened") 
     } 
    } 
} 

Xem thêm Hadoop Context type parameters in Kotlin cho một ví dụ tương tự và câu trả lời.

+0

Trả lời câu hỏi vì tôi là người mới đối với Kotlin: Tôi đang cố gắng giải quyết vấn đề này và mã trên câu trả lời không biên dịch cho tôi. Tôi cũng phải thêm tham số kiểu vào 'InnerClass', vì vậy nó kết thúc là' inner class ChildInnerClass: SuperClass .InnerClass () 'mà tôi nghĩ là câu trả lời được liên kết gợi ý làm gì ... tôi có thiếu cái gì đó không? – Augusto

+0

Bạn cần phải chỉ định tham số kiểu trên 'InnerClass' chỉ khi bạn định nghĩa nó với tham số kiểu (' protected open inner class InnerClass ') Trong đoạn mã này' InnerClass' không yêu cầu tham số kiểu và thay vào đó sử dụng T từ nó, ' SuperClass' – EiG

+0

@Augusto nếu mã trên câu trả lời không biên dịch cho bạn thì tôi đoán bạn đã thực hiện một số thay đổi đối với 'InnerClass', v.v. Như vậy, để rõ ràng, tôi đã cập nhật mã trong câu trả lời để bao gồm Khai báo 'SuperClass'. Bạn có thể sao chép và dán ví dụ vào một tệp Kotlin mới và nó sẽ biên dịch mà không có bất kỳ vấn đề nào. Xin vui lòng cho chúng tôi biết nếu nó không cho bạn. – mfulton26

Các vấn đề liên quan