2017-02-15 14 views
1

このエラーが発生しました。エラーが発生したクラスは次のとおりです。エラー:互換性のない型:java.lang.ObjectをEに変換できません

/** An array-based Stack. */  
public class ArrayStack<E> implements Stack { 

/** Array of items in this Stack. */ 
private E[] data; 

/** Number of items currently in this Stack. */ 
private int size; 

/** The Stack is initially empty. */ 
public ArrayStack() { 
data = (E[])(new Object[1]); // This causes a compiler warning 
size = 0; 
} 

public boolean isEmpty() { 
return size == 0; 
} 

public Object pop() { 
if (isEmpty()) { 
throw new EmptyStructureException(); 
} 
size--; 
return data[size]; 
} 

public Object peek() { 
if (isEmpty()) { 
throw new EmptyStructureException(); 
} 
return data[size - 1]; 
} 

/** Return true if data is full. */ 
protected boolean isFull() { 
return size == data.length; 
} 

public void push(Object target) { 
if (isFull()) { 
stretch(); 
} 
data[size] = target; 
size++; 
} 

/** Double the length of data. */ 
protected void stretch() { 
E[] newData = (E[])(new Object[data.length * 2]); // Warning 
for (int i = 0; i < data.length; i++) { 
newData[i] = data[i]; 
} 
data = newData; 
} 
} 

は、ここでそれが必要なの念にStackクラスです:

/** A last-in, first-out stack. */ 
public interface Stack<E> { 

/** Return true if this Stack is empty. */ 
public boolean isEmpty(); 

/** 
* Return the top item on this Stack, but do not modify the Stack. 
* @throws EmptyStructureException if this Stack is empty. 
*/ 
public E peek(); 

/** 
* Remove and return the top item on this Stack. 
* @throws EmptyStructureException if this Stack is empty. 
*/ 
public E pop(); 

/** Add target to the top of the Stack. */ 
public void push(E target); 

} 

エラーがプッシュ(オブジェクトのターゲット)メソッドでは、ArrayStackクラスのラインdata[size] = target;に関してです。

+1

少数の考えは:1) 'ArrayStack は単に' Stack'を実装するのではなく、 'スタックを実装しています。 2)次に、 'Object'という言葉をすべて取り除くことができます。また、 'new E [data.length * 2]'が動作するはずです。 – jensgram

答えて

0
Try this: 


/** 
* An array-based Stack. 
*/ 
public class ArrayStack<E> implements Stack<E> { 

/** 
* Array of items in this Stack. 
*/ 
private E[] data; 

/** 
* Number of items currently in this Stack. 
*/ 
private int size; 

/** 
* The Stack is initially empty. 
*/ 
public ArrayStack() { 
    data = (E[]) (new Object[1]); // This causes a compiler warning 
    size = 0; 
} 

public boolean isEmpty() { 
    return size == 0; 
} 

public E pop() { 
    if (isEmpty()) { 
     throw new RuntimeException(); 
    } 
    size--; 
    return data[size]; 
} 

public E peek() { 
    if (isEmpty()) { 
     throw new RuntimeException(); 
    } 
    return data[size - 1]; 
} 

/** 
* Return true if data is full. 
* 
* @return 
*/ 
protected boolean isFull() { 
    return size == data.length; 
} 

public void push(E target) { 
    if (isFull()) { 
     stretch(); 
    } 
    data[size] = target; 
    size++; 
} 

/** 
* Double the length of data. 
*/ 
protected void stretch() { 
    E[] newData = (E[]) (new Object[data.length * 2]); // Warning 
    for (int i = 0; i < data.length; i++) { 
     newData[i] = data[i]; 
    } 
    data = newData; 
} 
} 
+0

これは機能しました!キッカーはStackの後に最初の行に他のすべての上にを追加していました。 – Pacotacobell

1

ターゲットとデータの型が同じではありません。タイプが必要な場合はEを使用できます。これにより、コードの型がより安全になります。

変更プッシュ方式に:

public void push(E target) { 
if (isFull()) { 
    stretch(); 
} 
data[size] = target; 
size++; 
} 
3
data[size] = target; 

1)ここdataE arrayを参照しtargetObjectを指します。
ジェネリックスは型の安全性をもたらします。あなたが実装しているインタフェースのためのパラメータ化された型を提供していないので、あなたがオブジェクトからE.

2)public class ArrayStack<E> implements Stack {

に変換することができないことはできないが正しくありません。
public class ArrayStack<E> implements Stack<E> {を書くことはより安全で、Stackメソッドで使用されるパラメータ化された型を尊重してStackメソッドを実装することを余儀なくされます。たとえば :public void push(E target);

3)あなたの方法の代わりに、Objectにパラメータ化された型を使用する必要がありますする必要がありArrayStackで宣言されたパラメータ化された型に適合するように。

ので、あなたは

public void push(E target) { 

によって

public void push(Object target) { 

を交換する必要がありますし、あなたはそれが宣言された型Objectの代わりEとして操作する宣言すべてのメソッドで同じことを行う必要があります。

public Object peek() 

public Object pop() { 
1

あなたのデータ配列がタイプEであるため:たとえば

public void push(Object target) { 

をパラメータの型を持っている:

private E[] data; 

あなたは変更する必要がありますE.

Eは、実行時にString、Integerなどを指定できます。オブジェクトは実行時の型と同じではありません。

+0

実際には、 'Object'は実行時の型であると考えています。割り当てを許可するのは型セーフではないため、問題につながる可能性があるため、コンパイル時にジェネリックが失敗します。 –

関連する問題