2010-06-24 2 views
3

два класс:типа Integer refrence Строкового значение типа

public class BaseDo<K> { 
    protected K id; 

    public K getId() { 
     return id; 
    } 

    public void setId(K id) { 
     this.id = id; 
    } 
} 


public class BeanDo extends BaseDo<Integer> { 
    private String beanName; 

    public String getBeanName() { 
     return beanName; 
    } 

    public void setBeanName(String beanName) { 
     this.beanName = beanName; 
    } 
} 

Я хочу использовать для отражения implment так: ссылочного типа значения типа Строка

BeanDo beanDo = new BeanDo(); 
beanDo.setId("string here"); 

Integer. Кто может мне помочь?

+4

Почему бы вам не сделать это? – SLaks

+0

Итак, вы хотите иметь возможность установить целое число в строку? Почему бы не расширить 'BaseDo '? –

+0

@SLasks, мне приходит в голову, что для существующего фрагмента кода он имеет конкретный экземпляр «BeanDo» и имеет единственное, что у него есть как id, является строкой. Возможно, потому что он используется как int, но кто-то подумал, что было бы забавно, если бы они добавили в строку дополнительный идентификатор: '12345-N' (N для нормального) ... OMG Я думаю, что я прошел через это в прошлое ...: -S: -S – OscarRyz

ответ

0

Что-то вроде этого?

public class BaseDo<K> { 

    protected K id; 

    public K getId() { 
    return id; 
    } 

    public void setId(K id) { 
    this.id = id; 
    } 

} 

public class BeanDo extends BaseDo<Integer> { 

    private String beanName; 

    public void setId(String id) { 
    setId(Integer.parseInt(id)); 
    } 

    public String getBeanName() { 
    return beanName; 
    } 

    public void setBeanName(String beanName) { 
    this.beanName = beanName; 
    } 

} 

Теперь вы можете использовать что-то вроде этого:

BeanDo beanDo = new BeanDo(); 
beanDo.setId("2"); 
+0

-1 попробуйте с помощью: 'beanDo.setId (« string here »);' Использование 'someString.hashCode()' все, что необходимо, см. В моем ответе. – OscarRyz

+0

@rmarimon По крайней мере, оставьте мне комментарий о вашем downvote. – OscarRyz

0

Что об этом:

BeanDo beando = new BeanDo(); 
beando.setId("string there".hashCode()); 

Я не совсем понимаю, что вы имеете в виду с «Я хочу использовать отражать для реализации этого ".

Я думаю, вы хотите что-то вроде этого:

BeanDo doer = ... // get it from somewhere 
    String id = ... // get it from somewhere else too. 

    // and you want to set id to the doer bean. 
    reflectionMagicSetId(doer, id); 

И есть метод, как:

private void reflectionMagicSetId(BandDo doer, String id) { 
     /// do some magic here? 
} 

Если это то, что вы хотите, что я даю вам отлично работает.

private void reflectionMagicSetId(BandDo doer, String id) { 
    doer.setId(id == null ? 0 : id.hashCode() ); 
} 
+0

Неправильно использовать String.hashCode(), потому что несколько строк могут создавать одно и то же значение хэш-функции. Это не сработало бы, если бы оно использовалось в качестве первичного ключа в базе данных, например. Возможно, tidus2005 хочет создать составной ключ с целым числом и строкой? Невозможно узнать из вопроса. –

+0

Хорошая точка. Думаю, единственный оставшийся ресурс будет подклассом – OscarRyz

0

Если вы Wann использовать целое, то разобрать строку в целое число, как она будет содержать целое число и использовать это число в функции вызова аргумента

1

генериков в Java не используются во время выполнения, так, насколько java runtime касается вашего поля идентификатора типа Object и поэтому может быть настроено на любое значение независимо от генериков. Тем не менее, это плохая идея, поскольку все, что предполагает, что общий контракт не сработает.

Вы можете установить поле путем отражения следующим образом:

BeanDo beanDo = new BeanDo(); 
Method method = BeanDo.getClass().getMethod("setId", Object.class); 
method.invoke(beanDo, "SomeRandomString"); 

Тем не менее, делает это extreamly плохая идея, потому что любой код компилировать против BeanDo Предположим, что идентификатор представляет собой целое число не строка. Таким образом, любой код, например beanDo.getId(), завершится неудачей с исключением класса cast, потому что это не целое число.

Как и другие плакаты, я немного в темноте о том, чего вы пытаетесь достичь.

+0

. Я согласен с этим - просто потому, что вы МОЖЕТЕ не означает, что ВЫ ДОЛЖНЫ. Если у вас нет доступа ко всем местам, вызываемым getId(), вы не можете гарантировать, что позже не будете настраивать себя на проблемы. Если у вас есть доступ ко всем видам использования, вы должны просто изменить объект, чтобы явно использовать строку. – Curtis

0

Кажется, что это подкласс, единственный способ установить строку, но все же гарантировать, что любой, кто уже вызывает getId(), получает ожидаемое целое число. Что-то вроде этого:

 
public class StringBeanDo extends BeanDo { 
    private String stringId; 

    public String getStringId() 
    { 
    return stringId; 
    } 

    public void setId(Integer val) 
    { 
    super.setId(val); 
    stringId = Integer.toString(val); 
    } 

    public void setId(String str) 
    { 
    stringId = str; 
    super.setId(convertStringToInteger(str)); // Do this however you like. 
    } 
} 

Реализация convertStringToInteger бы к вам (это будет зависеть от того, что этот идентификатор используется для). Ключевым моментом здесь является то, что вы поддерживаете TWO ID и сохраняете их в синхронизации, чтобы старый код все еще мог хромать в некоторой степени.

Смежные вопросы