• 締切済み

汎用swap関数

Java初心者です。 C++のSTLを見習って汎用swap関数(メソッド)を書いてみたのですが、 どうもJavaは参照呼出しができないようで、うまく行きません。  private static <T> void swap( T a, T b ) {    T tmp;    tmp = a;    a = b;    b = tmp;    System.out.println( "inside swap : a=" + a + " b=" + b );  } Javaで汎用swap関数を書くのは不可能なのでしょうか?

みんなの回答

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.1

>Javaで汎用swap関数を書くのは不可能なのでしょうか? その通りです。 言語仕様がそうなっているのでどうしようもないですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列のswap

    文字列をswapするプログラムを作りたいと思っています。 やってみると、最初の一文字しかswapされません。 どうしてこれではいけないのでしょうか? よろしくお願いします。 以下が作ったプログラムです。 #include<stdio.h> void swap(char *a,char *b); int main() { char a[2][5]={"abc","efg"}; printf("befor a[0]:%s a[1]:%s?n",a[0],a[1]); swap(&a[0],&a[1]); printf("after a[0]:%s a[1]:%s?n",a[0],a[1]); } void swap(char *a,char *b) { char *tmp; tmp=*a; *a=*b; *b=tmp; } 実行結果は befor a[0]:abc a[1]:efg after a[0]:ebc a[1]:afg となります。 befor a[0]:abc a[1]:efg after a[0]:efg a[1]:abc となって欲しいです。

  • C++ 関数プロトタイプと値渡し・参照渡しについて

    次のコードは、入門書にあった値渡しのサンプルです。 値渡しなので、a=5 ,b=10が出力されます。 void swap(int x,int y); //←抜けていた int main(){ int a=5; int b=10; swap(a,b); cout<<"a="<< a << "\n"; cout<<"b="<<b<<"\n"; } void swap(int x,int y){ int tmp=x; x=y; y=tmp; } しかし、自分で入力したところ何故かa=10,b=5が出力されました。 (VisualC++2008で実行しました。) よく見てみると、上記1行目の関数プロトタイプが抜けていました。 入門書を読んだ限りでは、次の2点が理解できません。 (1)main関数の後ろにswap関数があり、関数プロトタイプが無いのでコンパイルエラーになるはずなのにならない (2)値渡しのはずなのに参照渡しと同じ結果になる よろしくお願いします。

  • 非staticフィールドを参照できない理由とは

     java勉強中です、宜しくお願いします。  下のようなプログラムを書き「Test1」をコメントアウトしたら、 「非staticフィールドをstatic参照できません。」というエラーが 出ました。  「Test1 t」をグローバル変数で定義したのですが、やはりを 「static」からは見れないということでしょうか。  「main」は特別な関数というのは分るのですが、staticフィールドとか クラスオブジェクトしか、main()からは覗けないという設計思想(?) とかはどのようなものなのでしょうか。  逆に覗けるのが可能ならばどのような不都合が生じるのでしょうか。  何かしら非常に不便を感じて使い勝手が悪いという気がして仕方ない のですが、特別にこうしなけらばならないとか、今までの他の言語であ った不具合(ex 隠蔽機能)を更に強化したためとかと言う理由があるの でしょうか。  ========================================================== public class Test1 { Test1 t; void calc() { int a = 2; int b = 3; System.out.println(a+b); } public static void main(String args[]) { /*Test1*/ t = new Test1(); t.calc(); } }

    • ベストアンサー
    • Java
  • final修飾子

    Javaでfinal修飾子があると学びました. ・メソッドはオーバーライドできない ・変数は値の変更ができない ・クラスは継承できない この3点を実現することが可能ですよね? #間違っている・他にもあるなら教えてください. 私はfinalを引数につけてみました. public class Test {   public static void main(String[] args) {      char[] s = {'s','a','t','o'};      System.out.println(s);      modify(s);      // finalのはずが変更されている      System.out.println(s);      Integer i = 3;      Integer j = 6;      swap(i, j);      System.out.println(i + ":" + j);      Foo f1, f2;      f1 = new Foo();      f2 = new Foo();      f1.i = 3;      f2.i = 6;      swap(f1, f2);      System.out.println(f1.i + ":" + f2.i);    }    static void modify(final char[] s) {      s[0] = 'k';    }    static void swap(Integer i, Integer j) {      Integer temp;      temp = i;      i = j;      j = temp;    }    static void swap(Foo f1, Foo f2) {      int temp;      temp = f1.i;      f1.i = f2.i;      f2.i = temp;    } } class Foo {    int i; } modify関数でfinal修飾子をつけるとsatoがkatoにならないと予想していました. ですが,実際にはコンパイルエラーにもならずsato→katoになりました. final修飾子はC言語でいうところのchar * const c;でしょうか? #ポインタの値は変更できないが,参照先の値は変更できるということですか? あと,swap関数についても質問があります. そもそもポインタがないので,基本型を実引数に与えるときはコピーされ, 参照型はコピーされないですよね? なので,swap関数を2つ用意してみました. Fooクラスのswap関数,Integerクラスのswap関数の2つです. Fooクラスがうまく交換でき,Integerクラスが交換できない理由がわかりません. #Integer temp;を使って参照値を交換していると思うのですが,違うのでしょうか?

    • ベストアンサー
    • Java
  • Javaの関数名が長い?

    Javaの超初学者です。 大学で、Cを多少やり、今度はJavaです。 少しJavaをいじってみたのですが、Javaの関数の長さってどうにか省略できないものでしょうか? 例えば、文字を表示する場合、Cならばprintfだけで良いのに対して JavaだとSystem.out.printlnなんて長ったらしい入力を求められますよね。 (ちなみにSystem.out.の部分の仕組みは多少はわかっています) キーボードから入力された文字を受け取るときもBuffer....みたく長いですよね。 これってどうにかできないものなのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • イテレータの要素を交換したい。

     こんにちは。 C++で、STLを使わず、イテレータの要素を交換したいのですが、中々いい方法が浮かびません。 イテレータの要素で、  A、B、C、D が並んでいるとして、D、B、C、A、順に実行したいのです。 (この要素は関数です) AのポインタとDのポインタを入れ替えればいいと思ってやったんですが、結果的には変化ありませんでした。 どうやったら要素だけを交換して、実行順をD、B、C、Aにできるんでしょうか? STLのitr_swapを使わずにお願いします。

  • ポインタの疑問点

    ポインタで分からないことがあります。 void swap(int* x, int* y){ int tmp; tmp = *x; *x = *y; *y = tmp; } /* int main(){ int *pA,*pB; *pA=5; *pB=10; cout << *pA << " , " << *pB <<"\n"; swap(pA,pB); cout << *pA << " , " << *pB <<"\n"; } */ int main(){ int a,b; a=5; b=10; cout << a << " , " << b <<"\n"; swap(&a,&b); cout << a << " , " << b <<"\n"; } 上のメイン関数ではエラーが起きます。どうしてなんでしょう? 下のと意味は同じだと思うのですが・・・

  • Java main関数内でStatic変数使えない

    JavaのStatic変数について質問です。 Main関数の中でStaticな変数を定義しようとしたところ、 final修飾子しか使えませんというエラー文言が出ます。 Main関数内でわざわざStatic変数を使用する必要はないのですが、 出来ないと言われると何故だろうと思ってしまいます。 どなたかご説明いただけないでしょうか? -------------------------------------------------------------------- class Test { public static void main(String[] args) { // 宣言時Staticは使えなく、finalでしか定義できないとエラーが出る Static int test_val = 10; // 表示 System.out.println(test_val); } }

    • ベストアンサー
    • Java
  • C++の関数ポインタについて

    例えば汎用的に整列操作を行えるクラスを作ろうと考えます。 で、以下のようなクラスをでっちあげました。 #include <stdlib.h> #include <stdio.h> #include <vector> using namespace std; template< class T >class Sort{ private: inline void swap( vector< T > data , int i , int j ){ T t = data[ i ]; data[ i ] = data[ j ]; data[ j ] = t; } public: vector< T > Data; Sort( vector< T > data ){ Data = data; } void selection( vector< T > data , int ( *func )( vector< T > data , int i , int j ) ) { int min , N = data.size(); {for( int i = 1; i < N; i++ ){ min = i; for( int j = i + 1; j <= N; j++ ){ if( func( data , min , j ) ){ min = j; } } swap( data , min , i ); }} } static int comp( vector< T > data , int i , int j ){ return data[ i ] >= data[ j ]; } }; void main( void ){ Sort< int > *d; vector< int > data( 20 ); d = new Sort< int >( data ); d->selection( data , d->comp ); return; } 中身は整列ソートだけでとても寂しいですが、教科書的に比較部分を汎用的に関数をユーザーが選んで指定できるようになっています。今回はmainからSortクラスでstaticで宣言したcompを指定していますが、staticにしたくないです。でもなっちゃっているのはstaticを外すとコンパイルエラーになるからです。 staticを外したメンバ関数を指定すると例えばこんなエラーがでます。 エラー E2034 template.cpp 43: 'int (* (_closure )(vector<int,allocator<int> >,int,int))(vector<int,allocator<int> >,int,int)' 型は 'int (*)(vector<int,allocator<int> >,int,int)' 型に変換できない(関数 main() ) エラー E2342 template.cpp 43: パラメータ 'func' は int (*)(vector<int,allocator<int> >,int,int) 型として定義されているので void は渡せない(関数 main() ) なんでこのようなエラーになるのか分かりません。メンバ関数を指定したいのですが、指定の仕方が分かりません。どなたか教えてください。本当に困ってしまっています。

  • 配列の受け渡し

    始めまして java初心者で恐縮なのですが, プログラムA.javaで作った配列をプログラムB.javaで利用する といったことがしたく,以下のようなプログラムを作成しました. ↓がプログラムA(HTest.java) import java.lang.*; import java.io.*; import java.util.*; public class HTest{ public static class Inner{ public static String[] inp = new String[200]; inp = Input(); } public static String[] Input() { String[] abc = {"a", "b", "c", "d", "e", "f", "g"}; return abc; } } ↓がプログラムB(YTest.java) import java.util.*; public class YTest{ public static void main(String[] args){ String query = "a"; int i,j; for(i=0; i<7; i++){ if(HTest.Inner.inp[i].indexOf(query) != -1) { System.out.println("Hit!"); } } } } YTest.javaをコンパイルすると, .\HTest.java:10: <identifier>がありません。 inp = Input(); ^ .\HTest.java:10: シンボルを見つけられません。 シンボル:クラス inp 場所 : HTest.Inner のクラス inp = Input(); ^ といったエラーが出ます. 構文がどこかおかしいのでしょうか? どこがおかしいのか分かりません どなたか是非ご教授お願いいたします.