Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Lortech
    addikt

    Miért nem simán T a paraméter az első add függvényedben, az interface-ben? Ha azt csinálod, akkor azzal meg tudod akadályozni, hogy a "impl1.add(impraw);" illetve a "impl2.add(impraw);" leforduljon. Persze az impraw.add fogad mindenféle típusú interface-et. Aztán ha type mismatch van, akkor futási időben száll el a
    paramEnforcerMatrix.add(paramEnforcerVector); sor.

    public interface ParamEnforcer<T extends ParamEnforcer<T>> {

    void add(T other);

    }

    class MatrixType implements ParamEnforcer<MatrixType> {

    @Override
    public void add(MatrixType other) {

    }
    }

    class VectorType implements ParamEnforcer<VectorType> {
    @Override
    public void add(VectorType other) {

    }
    }

    class Tester {
    void test() {
    MatrixType matrixType = new MatrixType();
    ParamEnforcer paramEnforcerMatrix = matrixType;

    VectorType vectorType = new VectorType();
    ParamEnforcer paramEnforcerVector = vectorType;

    matrixType.add(matrixType);
    vectorType.add(vectorType);
    paramEnforcerMatrix.add(paramEnforcerVector);

    }
    }

    Ha azt csinálod, akkor azzal meg tudod akadályozni, hogy a "impl1.add(impraw);" illetve a "impl2.add(impraw);" leforduljon.
    De azt is megakadályozza, hogy az
    impl1.add(impl1);
    impl2.add(impl2);
    forduljon. De ja, igazából nem vagyunk sokkal beljebb az IF1<T> fordítási idejű típussal sem az Imp1 / Imp2 helyett. IF1<T> -vel mind a két imp típuskompatibilis - nem úgy a Matrixtype és Vectortype egymással -, ezért nem kapsz classcastexceptiont, ahogy a példádban viszont igen. Fordítás időben kéne tudni kiküszöbölni ezt az esetet, de a generikusok erre nem jók javában.

Új hozzászólás Aktív témák