4

ねえ、私はすぐに受講するコースでJavaを始めたばかりです(ええ、私はオタクです。クラスを始める前に勉強しています)。Javaですべてがどのように連携するかを学ぶために、いくつかの概念をまとめたいと思いました。

さて、私がやりたかったのは、単純なShape(フランス語でForme)クラスです。このクラスからは、少なくとも1〜2のクラスが継承され、コレクションオブジェクト内にいくつかのインスタンスが作成されます。また、それらのクラスをジェネリックにして、それも試してみたかったのです。それは私が問題を抱えている部分です。

私はC++に非常に慣れているので、混乱が生じる可能性がありますが、ジェネリックを使用できないようです。たとえば、ディメンションを整数、ダブル、フロートなどに指定できます。 。出来ますか ?

以下のGetArea()メソッドは、baseとのためにコンパイルできませんhauteur

package testconcepts;

import java.util.*;
import java.lang.*;

abstract class Forme <T extends Number> {
    protected String nom_forme;

    String NomForme() { return nom_forme; }

    abstract Double GetArea();
}

class Triangle <T extends Number> extends Forme {
    protected T base, hauteur;

    Triangle() { 
        this.nom_forme = "TRIANGLE"; 
    }

    @Override
    Double GetArea() { return base * hauteur / 2; }

    T GetBase() { return base; }
    T GetHauteur() { return hauteur; }
    void SetBase(T base) { this.base = base; }
    void SetHauteur(T hauteur) { this.hauteur = hauteur; }
}

public class TestConceptsJava {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new Triangle<Double>());
    }
}

型の問題のため、コンストラクターで0に割り当てることもできないことに注意してください。

また、非常によく似たトピックがあることは知っていますが、他の質問ではまだ問題の解決策を見つけていません。

TLDRプリミティブ型ラッパー(Double、Integer ..)を使用してジェネリックスを機能させるにはどうすればよいですか?

4

5 に答える 5

6

だからあなたの問題は私が推測するこの行です:

Double GetArea() { return base * hauteur / 2; }

エラーが発生する理由は*、タイプがのオブジェクトに対して演算子が定義されていないためですNumberintsとdoubles(私が推測する)を扱うことを知っているので、これを試すことができます:

Double GetArea() { return base.doubleValue() * hauteur.doubleValue() / 2; }

注意として、通常、メソッド名は小文字で始まりgetArea()ます。

于 2012-10-05T21:11:29.903 に答える
3

GetArea()では、2つのクラスで*演算子を呼び出しています。次のようなことを言うのはどのくらい意味がありますか。

Object o1 = //whatever;
Object o2 = //whatever;

return o1 * o2;

あまり正しくないですか?2つのクラスを掛けることはできません。実際に実行したいのは、これらのラッパークラスの基になる値を乗算することです(これは、Javaでは暗黙的に実行されません)。GetArea()をこのように書き直すと、問題が解決するはずです。

Double GetArea() { return base.doubleValue() * hauteur.doubleValue() / 2; }

また、そのクラスで気になる他のすべての場所で基になる値を使用する必要があることに注意してください。

于 2012-10-05T21:11:36.683 に答える
1

に変更するDouble GetArea() { return base.doubleValue() * hauteur.doubleValue() / 2; }とコードがコンパイルされますが、Javaのジェネリックはこれに適していないため、これはJavaではお勧めできません。これらは、基本的に、オブジェクトのコレクションを使用するときに静的型の安全性を確保するためのものです。

*Javaには演算子のオーバーロードがないため、プリミティブ型以外では機能することは期待できません。

基本的なJavaジェネリックチュートリアルを読んで、Javaでのそれらの目的を理解することをお勧めします:http://docs.oracle.com/javase/1.5.0/docs/guide/language/generics.html

于 2012-10-05T21:10:57.037 に答える
1

計算のこの部分を見てください。

base * hauteur

とは両方とも ラッパークラスを使用して宣言されているため、プリミティブ型の場合のように演算子を使用することはできません。代わりに、値を明示的に取得する必要があります。basehauteur*

base.doubleValue() * hauteur.doubleValue()

baseまたはhauteurがプリミティブ型で宣言されている場合、これは問題にならないことに注意してください。次に、Javaコンパイラーは、自動アンボックス化を使用して、もう一方を適切なタイプに変換し、必要な暗黙の変換を実行できるようになります。

于 2012-10-05T21:11:28.173 に答える
1

あなたが探しているのは「自動(アン)ボクシング」と呼ばれるものです。残念ながら、の操作はのすべてのサブタイプTに対して有効である必要があり、「auto-(un)boxing」はそのような操作ではありません(たとえば、では機能しません)。NumberBigInteger

于 2012-10-05T21:11:56.267 に答える