Hirdetés

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

  • Drizzt
    nagyúr

    Röviden: tényleg nincs.

    Csinálhatsz generikus interface-t:

    public interface IF1<T extends IF1> {
    void add(IF1<T> other);
    }

    public class Imp1 implements IF1<Imp1> {
    @Override
    public void add(IF1<Imp1> Other) {
    }
    }

    public class Imp2 implements IF1<Imp2> {

    @Override
    public void add(IF1<Imp2> other) {
    }
    }

    {
    IF1 impraw = new Imp2();
    IF1<Imp1> impl1 = new Imp1();
    IF1<Imp2> impl2 = new Imp2();
    impraw.add(impraw);
    impraw.add(impl1);
    impraw.add(impl2);
    impl1.add(impl1);
    impl1.add(impraw);

    impl2.add(impl2);
    impl2.add(impraw);

    pass(impraw, impl1);
    pass(impl1, impraw);

    pass2(impl2, impl1);
    }

    private static void pass(IF1<Imp1> one, IF1 other) {
    one.add(other);
    other.add(one);
    }

    private static void pass2(IF1 one, IF1 other) {
    one.add(other);
    other.add(one);
    }

    De ez jobbára csak bohóckodás, mert ha használni akarod, úgyis meg kell adnod a típus paramétert fordítás időben, hogy garantáltan *csak saját magával tudd átadni neki, vagy típus paraméter nélkül hagyod és unchecked leszel. Valamint raw IF1 (impraw-t) IF1 példányt oda vissza tudod passzolgatni futási és fordítási hiba nélkül.

    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);

    }
    }

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