সংগ্রহ.এম্পটিলিস্ট () একটি তালিকা << বিষয়> ফেরত দেয়?


269

জেনেরিক ধরণের পরামিতিগুলি অনুমান করার জন্য জাভার নিয়ম নেভিগেট করতে আমার কিছুটা সমস্যা হচ্ছে। নিম্নলিখিত ক্লাসটি বিবেচনা করুন, যার একটি listচ্ছিক তালিকার প্যারামিটার রয়েছে:

import java.util.Collections;
import java.util.List;

public class Person {
  private String name;
  private List<String> nicknames;

  public Person(String name) {
    this(name,Collections.emptyList());
  }

  public Person(String name,List<String> nicknames) {
    this.name = name;
    this.nicknames = nicknames;
  }
}

আমার জাভা সংকলক নিম্নলিখিত ত্রুটি দেয়:

Person.java:9: The constructor Person(String, List<Object>) is undefined

কিন্তু Collections.emptyList()রিটার্ন টাইপ <T> List<T>, না List<Object>। একটি কাস্ট যোগ করা কোনও উপকারে আসে না

public Person(String name) {
  this(name,(List<String>)Collections.emptyList());
}

উৎপাদনের

Person.java:9: inconvertible types

এর EMPTY_LISTপরিবর্তে ব্যবহার করা হচ্ছেemptyList()

public Person(String name) {
  this(name,Collections.EMPTY_LIST);
}

উৎপাদনের

Person.java:9: warning: [unchecked] unchecked conversion

যেখানে নিম্নলিখিত পরিবর্তন ত্রুটিটি দূরে সরিয়ে দেয়:

public Person(String name) {
  this.name = name;
  this.nicknames = Collections.emptyList();
}

আমি এখানে কোন ধরণের-চেকিংয়ের বিরুদ্ধে লড়াই করছি এবং এর চারপাশে কাজ করার সর্বোত্তম উপায়টি কি কেউ ব্যাখ্যা করতে পারবেন? এই উদাহরণে, চূড়ান্ত কোড উদাহরণ সন্তোষজনক, তবে বৃহত্তর ক্লাসগুলির সাথে, আমি নকল কোড ছাড়াই এই "alচ্ছিক প্যারামিটার" প্যাটার্ন অনুসরণ করে পদ্ধতিগুলি লিখতে সক্ষম হতে চাই।

অতিরিক্ত creditণের জন্য: EMPTY_LISTবিপরীতে ব্যবহার করা কখন উপযুক্ত emptyList()?


1
জাভা জেনেরিক্স সম্পর্কিত সমস্ত প্রশ্নের জন্য, আমি ফিলিপ ওয়েডলারের মরিস নাফটালিনের " জাভা জেনেরিক্স এবং সংগ্রহগুলি " রত সুপারিশ করছি।
জুলিয়েন চ্যাস্তং

উত্তর:


447

আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা হ'ল পদ্ধতিটি emptyList()ফিরে আসার পরেও List<T>আপনি এটিকে প্রকারটি সরবরাহ করেন নি, তাই এটি ফিরে আসার ক্ষেত্রে ডিফল্ট হয় List<Object>। আপনি টাইপ প্যারামিটার সরবরাহ করতে পারেন এবং আপনার কোডটি প্রত্যাশা অনুযায়ী আচরণ করা উচিত:

public Person(String name) {
  this(name,Collections.<String>emptyList());
}

এখন আপনি যখন সরাসরি কাজটি করছেন, সংকলকটি আপনার জন্য জেনেরিক ধরণের পরামিতিগুলি বের করতে পারে। একে টাইপ ইনফারেন্স বলা হয়। উদাহরণস্বরূপ, আপনি যদি এটি করেন:

public Person(String name) {
  List<String> emptyList = Collections.emptyList();
  this(name, emptyList);
}

তারপরে emptyList()কলটি সঠিকভাবে ফিরে আসবে List<String>


12
বুঝেছি. এমএল বিশ্ব থেকে আগত, এটি আমার কাছে অদ্ভুত যে জাভা সঠিক ধরণের অনুমান করতে পারে না: ফর্মাল প্যারামিটারের ধরণ এবং খালি তালিকার রিটার্নের ধরণটি স্পষ্টভাবে অখণ্ডিত। তবে আমার ধারণা অনুমানকারী কেবলমাত্র "শিশুর পদক্ষেপগুলি" নিতে পারেন।
ক্রিস কনওয়ে

5
কিছু সাধারণ ক্ষেত্রে, কম্পাইলারের পক্ষে এই ক্ষেত্রে অনুপস্থিত প্রকারের প্যারামিটারটি নির্ধারণ করা সম্ভব বলে মনে হচ্ছে - তবে এটি বিপজ্জনক হতে পারে। যদি পদ্ধতির একাধিক সংস্করণ বিভিন্ন পরামিতিগুলির সাথে উপস্থিত থাকে তবে আপনি ভুলটিকে কল করতে পারেন। এবং দ্বিতীয়টি এখনও উপস্থিত থাকতে পারে না ...
বিল মিশেল

13
"সংকলন। <স্ট্রিং> খালি তালিকা ()" স্বরলিপিটি সত্যই অদ্ভুত, তবে তা উপলব্ধি করে। এনাম <ই << Enum <E>> এর চেয়ে সহজ। :)
থিয়াগো চ্যাভস

12
জাভা 8-তে আর কোনও প্রকারের প্যারামিটার সরবরাহের প্রয়োজন নেই (যদি না সম্ভাব্য জেনেরিক ধরণের ক্ষেত্রে দ্ব্যর্থতা না থাকে)।
ভিটালিই ফেদোরেনকো

9
দ্বিতীয় স্নিপেটটি প্রকারভেদটি দুর্দান্তভাবে প্রদর্শন করে তবে অবশ্যই সংকলন করবে না। কলটি thisকনস্ট্রাক্টরের প্রথম বিবৃতি হতে হবে।
আরজান

99

আপনি ব্যবহার করতে চান:

Collections.<String>emptyList();

খালি তালিকা কীসের জন্য উত্সের দিকে নজর দিলে আপনি দেখতে পাচ্ছেন যে এটি আসলে একটি করে

return (List<T>)EMPTY_LIST;

26

খালি তালিকা পদ্ধতিতে এই স্বাক্ষর রয়েছে:

public static final <T> List<T> emptyList()

যে <T>শব্দ তালিকা মানে এটি পরিবর্তনশীল ধরণ ফলাফলের নির্ধারিত হয় থেকে জেনেরিক প্যারামিটার টি মান infers আগে। সুতরাং এই ক্ষেত্রে:

List<String> stringList = Collections.emptyList();

তারপরে ফেরতের মানটি ধরণের পরিবর্তকের দ্বারা স্পষ্টভাবে উল্লেখ করা হয় List<String>, তাই সংকলক এটি নির্ধারণ করতে পারে। এক্ষেত্রে:

setList(Collections.emptyList());

জেনেরিক টাইপটি বের করার জন্য সংকলকটির জন্য সুস্পষ্ট রিটার্ন পরিবর্তনশীল নেই, তাই এটি ডিফল্ট হয় Object

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.