1

At the moment, I am preparing for an exam which I will write in two days. At the example-questions I found the following question:

Will this compile?

FavoritesList<Person> l = new FavoritesList<Contact>();

(Contact extends Person)

I would have answered yes, because if I have the following:

FavoritesList<Person> l = new FavoritesList<Person>();
l.add(new Contact());

that's fine. Why isn't it fine in the first example?

keep in mind: Contact extends Person!

Thanks in advance Best regards


you don't have to create a service on each computer. Service Broker objects can be confined to one DB server. For example, if you have 100 computers that need to drop of a message, they will need a connection string to the database server and execute a stored procedure that would enqueue the said message.
that said, it seems like a Service Broker queue would be an overkill for this. A simple table would probably suffice, or even better an MSMSQ (which would eliminate the need to connect to a DB).

4

7 に答える 7

2

これは禁止されていますが、その理由を指摘させてください。

考えてみましょう:

FavoritesList<Person> l = new FavoritesList<Contact>();

FavoritesList<Person>許可されているが禁止されている操作、つまり の契約を破るFavoritesList<Contact>サブクラスの追加があります。PersonFavoritesList<Contact>

あなたが探しているものは次のとおりです。

 FavoritesList<? extends Person> wildcardedList = new FavoritesList<Contact>();

つまり、これは特定されていない type のリストであり?、このリスト内のすべての要素はこの typeであり、この型が person を拡張?していることがわかります。?このタイプのワイルドカードは、最初は直感的ではない可能性があることに注意してください。基本的に、彼らがあなたに与えるのは、このリストの読み取り専用ビューです。

仮定しましょう:

 class FavoritesList<T>{

    void add(T t){...}

 }

基本的にあなたは呼び出すことができません:

 wildcardedList.add(new Contact()); 

または:

 wildcardedList.add(new Contact()); 

PersonorContactが指定されていない型 T であるかどうかがわからないためです。

そのためには、パラメーターのタイプにワイルドカードを追加する必要がaddあり、それは面倒です。

于 2013-06-30T19:04:01.117 に答える
1

Javaのジェネリックは継承をサポートしていないため、これは問題ありません。 これFavoritesList<Contact>は、のサブタイプではないことを意味します。FavoritesList<Person>

于 2013-06-30T19:00:51.713 に答える
0

いいえ、うまくいきません。Java はジェネリックの共分散のプロパティを提供しないため、 Contact が Person を拡張する場合、これはそのFavoritesList<Contact>extendsを意味しませんFavoritesList<Person>

于 2013-06-30T19:01:03.637 に答える
0

Person の別のサブクラスがあると想像してください (たとえば、Enemy は、Enemy が Person を拡張したものです)。

次に、最初が許可されている場合は、次のことができます。

FavoritesList<Contact> contacts = // a list of some Contacts
FavoritesList<Person> l = contacts;

// at this point, contacts and l both reference the same object!

l.add(new Enemy()); // allowed by the compiler since enemy is a person

// now contacts contains an enemy which is bad since Enemy is not a Contact!
Contact c = contacts.get(contacts.size() - 1); // would throw a class cast exception if the compiler allowed the above

Java はワイルドカードを使用してこれに対する回避策を提供することに注意してください。

FavoritesList<Contact> contacts = // a list of some Contacts
FavoritesList<? extends Person> l = contacts;

Person person = l.get(0); // ok since we know everything in l is some class that extends Person
l.add(new Enemy()); // won't compile, since we can't verify that Enemy is the ?
于 2013-06-30T19:02:30.280 に答える
0

それを許可すると、他のタイプのPersonを のリストに挿入できるようになるため、問題はありませんContactContacts の不変リストがs の不変リストでPersonあることは事実ですが、sの変更可能なリストがContacts の変更可能なリストであることは真実ではありません。 s の変更可能なリスト。PersonContactPersonContact

その結果、Java は安全上の理由から、このようなことを行うことを禁止しています。あなたができることは次のようなものです:

FavoritesList<? extends Person> l = new FavoritesList<Contact>();

Contact非ビアを挿入しFavoritesList<? extends Person>てリストを壊すことはできないため、これは有効です。

他の言語 (例: C#、Scala) では、型パラメーターに共変性および反変性アノテーションを提供して、この種の状況で許可される変換をより詳細に制御できます (たとえば、型パラメーターが共変である場合は、型パラメーターを共変としてマークできます。 )Thing<Derived>に変換されますThing<Base>が、Java では変換されません。これは、物事をより明確にする可能性のある主題に関する C# リファレンスです。

http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

于 2013-06-30T19:02:53.413 に答える
0

FavoritesList<Person> l = new FavoritesList<Contact>();あなたが作成FavoritesListしたs Contact

しかし、参照を介して、そのリストにlet のように、Person を拡張するあらゆる種類のクラスまたはクラスFavoritesList<Person> lのインスタンスを追加できます。PersonEmployee

安全だと思いますか?

于 2013-06-30T19:03:21.147 に答える