2009-06-29 17 views

答えて

2

番号List<apple>およびList<fruit>は関連していません。これらの両方のクラスは完全に異なる実装を持つことができ、一方を他方に変換する方法はありません。例えば、List<>テンプレートは、List<T>テンプレートとはまったく異なる構造を持つappleに対して何らかの方法で特殊化することができます。

実装が互換性があっても、List<apple>List<fruit>として扱うことは悪い考えです。その後、リンゴを含むと考えられていたリストにすべての種類の果物を入れ始めるからです。このentry in the C++ FAQ Liteも参照してください。

1

質問はちょっと混乱しますが、私の最初の回答は少なくとも普通のプログラミング言語ではではありません。です。 の任意の変形もBの同じ変化のサブクラスであることを意味するものではないBをサブクラス

5

いいえ! Mutable容器はちょうどそのようには機能しません - 実際にはOOPの魅力的な側面です。

List<fruit>には、List<apple>にバナナを挿入することはできません。 Liskovの原則に違反して、あなたがサブクラス化していないことが証明されます。

変更不可能なのコンテナは実際には期待通りに機能します(共分散は技術の用語です)。

面白いことに、この魅力的な法則を印刷したことはありませんでした(の世界ではのオブジェクトはあなたがSquare IS-A Rectangleと言うことはできませんが... 不変オブジェクト、です!) - 私はちょうど経験と観察を通して私自身でそれを思いついた。私はこの文脈で使用する学術的なリファレンスが好きです。だれかがそれを引き出すことができれば;-)

+0

1をそれを行うことはできません専門用語... –

+0

として "共分散"を指摘すると、コンテキスト、共分散および反差異に応じて、.NET 4.0で許可されます(http://msdn.microsoft.com/en-us/library/dd465120(VS.100) ).aspx) –

0

Javaでは、はList<Fruit>のサブクラスではありません。それらは両方ともタイプListです。

これを示すいくつかのJavaコードがあります。

import java.util.LinkedList; 
import java.util.List; 

class Fruit { } 

class Apple extends Fruit { } 

public class Main { 

    public static void main(String[] args) { 
     Fruit fruit = new Fruit(); 
     Apple apple = new Apple(); 
     List<Fruit> fruitList = new LinkedList<Fruit>(); 
     List<Apple> appleList = new LinkedList<Apple>(); 

     System.out.println(fruit.getClass().getSuperclass()); 
     System.out.println(apple.getClass().getSuperclass()); 
     System.out.println(fruitList.getClass().getSuperclass()); 
     System.out.println(appleList.getClass().getSuperclass()); 
    } 

} 

出力:

class java.lang.Object 
class Fruit 
class java.util.AbstractSequentialList 
class java.util.AbstractSequentialList 
+0

これは、適切なsupを持っていないjavaでのみ当てはまりますジェネリックのポート(型消去を使用)。たとえば、.NET言語ではそうではありません。 –

0

は、言語に依存します - C#4.0で、あなたがIList<object>IList<something>をキャストすることができるようになりますが、あなたがのためのC#3.0

関連する問題