2017-12-24 9 views
0

です。オブジェクトの微妙な変更であるジェネリック型の混乱に直面しました。私は自分のプロジェクトをやっている間に、ジェネリック型の違いを作るのは

通常、私はノードを構築し、私は

public class HW3<E> { 
    private Tree<E> treeNode = new Tree <E>(); 

このような一般的な宣言をしかし、私はこのようにそれを行う場合は、今、これはあまりにも通常通りに表示されます。

public class HW3<E> { 
    private Tree<Object> treeNode = new Tree <Object>(); 

だから、私は本当にこれら二つの違いを知って誘惑しています:私はメインクラスのオブジェクトへの可能性は低いオブジェクトタイプの異なる基準としてノードを構築するケースを。どのような例も歓迎します。あなたの知識を共有してください。ありがとうございました。

+0

あなたが求めていることは私には少し不明です。 'E'と' Object'の違いについて質問していますか? – 4castle

+0

はい、かなり。私はEとObjectが違うと思ったが、上記のようなものを使うと、エラーなく動作する。あるいは、 "E"と "Object"は同じものですか? – sbot

答えて

0

これらの2つの構文の違いは、コードを呼び出す必要がある(外部でもなくても)場合があります。

要するに、最初のコードでは呼び出し元がジェネリックスを利用できるようになり、2番目のコードではジェネリックスを利用できなくなります。これは、treeNodeフィールドまでしかありません。

は、ツリー/オブジェクト(完全に仮想的な)を取得するためにあなたの顧客のためのメソッドを追加することであったと想定します

最初のバージョンは次のようになります。

public class HW3<E> { 
    private Tree<E> treeNode = new Tree <E>(); 
    public E getNodeData(); 

最初のケースでは、あなたのクライアントはあなたを呼び出すことができますコードをキャストする必要はありません。

MW3<SomeType> hw3 = ...//create instance 
SomeType data = hw3.getNodeData(); 

Javaはこれとジェネリックについて知っているので、キャストを避けることができます。

セカンドバージョンがなければならないであろう:、ジェネリックを使用して、オブジェクトを使用した場合、クライアントがキャストしなければならない、このバージョンとは異なり

public class HW3<E> { 
    private Tree<Object> treeNode = new Tree <Object>(); 
    public Object getNodeData(); //You would have to do this because the field with data wouldn't know about the generic type 

:つまり

MW3<SomeType> hw3 = ...//create instance 
SomeType data = (SomeType) hw3.getNodeData(); 

Eタイプのパラメータは2番目の例では全く役に立たず、単純に使用しないでください。 私が使用した例では、あなたのTreeタイプは、いくつかの一般的なget方法...詳細は

java.util.ArrayListような、一般的なタイプの実装を見てみましょうを持っていると仮定。スニペットの主な違いは、タイプパラメータの使用方法と、発信者にそのメリットをどのように享受させるかです。

+0

すべての詳細をありがとう。それは助けた – sbot

0

私たちはクラスレベルでジェネリック型を定義するとき、私たちは基本的に、我々は

すなわち、定義の時点で知られていない、クラスHW3で タイプに対処することがありますJavaコンパイラを言っています
public class HW3<E> { 
    ... 
} 

ただし、使用法に基づいて導かれます。あなたは

HW3<Integer> myHw3OfIntegers = new HW3<Integer>(); 
HW3<String> myHw3OfStrings = new HW3<String>(); 

を書くときだから、今上記の2つの宣言が生成されたオブジェクトのtreeNode分野に影響を与えるかを見ることができます。最初のオブジェクトmyHw3OfIntegersは、Integersのツリーを表し、2番目のオブジェクトmyHw3OfStringsはStringのツリーを表します。

+0

ああ、私はそれを得た。情報をありがとう – sbot

関連する問題