Hai Saya mengalami masalah dengan Jenis Generik dan peringatan yang saya dapatkan dari IDE. Saya memiliki kelas yang menyimpan nilai tipe generik:

public class Result <OUT>{
    private final OUT outputValue;
    
    public OUT getOutputValue() {
        return outputValue;
    }
}

Saya memiliki kelas abstrak:

public abstract class CustomSource {

      public abstract <T> SourceFunction<T> getSource();
}

Dan kelas yang memperluasnya:

public class OtherCustomSource extends CustomSource {

      @Override
      public SourceFunction<Result<MyEvent>> getSource() {
          ...some code...
      }
    }

IDE memberi saya peringatan: tipe pengembalian override yang tidak dicentang memerlukan konversi yang tidak dicentang. Apa yang saya lewatkan?

0
Theorem_101 28 Mei 2021, 18:23

1 menjawab

Jawaban Terbaik
public abstract <T> SourceFunction<T> getSource();

Ini bukan janji yang ingin Anda buat. Ini mengatakan "untuk setiap T, saya berjanji saya bisa mendapatkan sumber tipe SourceFunction<T>." Kemudian Anda datang dan mensubklasifikasikannya dengan

public SourceFunction<Result<MyEvent>> getSource();

Yang mengatakan "secara khusus, saya bisa memberi Anda sumber tipe Result<MyEvent>", janji yang jauh lebih lemah.

Jika Anda bermaksud agar getSource hanya mengembalikan satu jenis tertentu, generik Anda harus berada di kelas CustomSource, bukan fungsi getSource.

public abstract class CustomSource<T> {
  public abstract SourceFunction<T> getSource();
}

public class OtherCustomSource extends CustomSource<Result<MyEvent>> {

  @Override
  public SourceFunction<Result<MyEvent>> getSource() {
      ...some code...
  }
}

Maka masuk akal untuk menggunakan OtherCustomSource sebagai CustomSource<Result<MyEvent>> (karena bisa mendapatkan sumber tipe Result<MyEvent>), tetapi tidak masuk akal untuk memperlakukan OtherCustomSource sebagai CustomSource<Integer>, misalnya.

2
Silvio Mayolo 28 Mei 2021, 15:28